您的位置:首页 > 其它

有关删除数字的dp问题

2017-04-12 09:06 155 查看
题意:给定一个数字(100000位)求删除最少的数字使其%6为0(不能有前导0);

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: