HDU 4433

来源:互联网 发布:java服务器监控系统 编辑:程序博客网 时间:2024/06/05 16:43

这个题我做的时候yy各种贪心,结果一直WA

可能是情况考虑不全吧,今天生成了些数据,发现贪心果然好多漏洞,比如我就挂这组test:0000 5467

改成暴力枚举就过了

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>using namespace std;char s1[1100],s2[1100];int s[1100];int dp[1100][11][11];int main(){    int i,j,k,p,q,len,step;    while(scanf("%s %s",s1,s2)!=EOF){        len=strlen(s1);        for(i=0;i<len;i++)            s[i]=(s2[i]-s1[i]+10)%10;        s[i]=s[i+1]=0;        memset(dp,-1,sizeof(dp));        dp[1][s[0]][s[1]]=0;        for(i=2;i<len+2;i++){            for(j=0;j<10;j++)                for(k=0;k<10;k++){                    if(dp[i-1][j][k]==-1)continue;                    step=10-j;                    for(p=0;p<=step;p++){                        for(q=0;q<=p;q++){                            if(dp[i][(k+p)%10][(s[i]+q)%10]==-1) dp[i][(k+p)%10][(s[i]+q)%10]=dp[i-1][j][k]+step;                            else dp[i][(k+p)%10][(s[i]+q)%10]=min(dp[i][(k+p)%10][(s[i]+q)%10],dp[i-1][j][k]+step);                        }                    }                    step=j;                    for(p=0;p<=step;p++){                        for(q=0;q<=p;q++){                            if(dp[i][(k-p+10)%10][(s[i]-q+10)%10]==-1) dp[i][(k-p+10)%10][(s[i]-q+10)%10]=dp[i-1][j][k]+step;                            else dp[i][(k-p+10)%10][(s[i]-q+10)%10]=min(dp[i][(k-p+10)%10][(s[i]-q+10)%10],dp[i-1][j][k]+step);                        }                    }                }        }        int ans=-1,tem=len+1;        for(i=0;i<10;i++)            for(j=0;j<10;j++){                if(dp[tem][i][j]==-1)continue;                if(ans==-1 || ans>dp[tem][i][j]) ans=dp[tem][i][j];            }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击