有关删除数字的dp问题
2017-04-12 09:06
155 查看
题意:给定一个数字(100000位)求删除最少的数字使其%6为0(不能有前导0);
Input 1
0010456
Output 1
4
Input 2
11
Output 2
-1s
Input 1
0010456
Output 1
4
Input 2
11
Output 2
-1s
#include<cstdio> #include<cstring> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int dp[100010][10];//dp[i][j]代表前i位余数为j时最少需要删除的数字个数 void solve(string s) { memset(dp,0x3f,sizeof(dp)); int len=s.size(); for(int i=0; i<len; i++) { if(s[i]!='0')//预处理当前数字不为0时 { int tmp=(s[i]-'0')%6; dp[i+1][tmp]=i;//删除前面的所有数使得余数为tmp } for(int j=0; j<6; j++)//枚举余数 { dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1);//当前余j取前一位余j的长度,删掉当前位(前一位余j的长度加一); int tmp=(j*10+s[i]-'0')%6;//前一位余j到当前位就会余tmp dp[i+1][tmp]=min(dp[i+1][tmp],dp[i][j]);//取前一位余j余当前位余tmp的最小值 } } } int main() { string s; while(cin>>s) { solve(s); int len=s.size(); int ans=inf; for(int i=0; i<len; i++)//如果有0课删除len-1位 if(s[i]=='0') { ans=len-1; break; } ans=min(ans,dp[len][0]); if(ans==inf) printf("-1s\n"); else printf("%d\n",len-ans); } }
相关文章推荐
- 有关XP上完全删除Oracle 10g的问题
- 有关CAB数字签名的问题
- 挑战程序设计竞赛2.3.3 有关计数问题的DP 多重集组合数
- 有关计数问题的DP 划分数
- 挑战P66 有关计数问题的dp
- 使用动态规划解决有关数字组合的问题
- hrbust 1817 数字添加号问题【dp】
- shfileoperation 提示无法删除文件的有关问题
- n个数字形成一个圆圈,隔m个数字删除一个的问题
- n位数字删除数问题
- 【dp】数字三角形问题
- 最简单的贪心算法--删除数字问题
- 关于Devexpress xtraGrid中数字字段删除数字后出现输入字符串格式不正确问题的解决方案
- 2015寒假集训--dp--数字三角形问题
- ACM 191. 取数字问题(dp)
- 疑问:有关删除LICENSE.LICX的问题
- 有关反掩码数字为非2^(32-n)-1例如为0.0.0.254的问题
- DP_数字三角形问题
- java代码实现贪心算法删除数字问题
- 有关windows系统explorer删除文件、改名,新建文件不会自动刷新的问题