这个题我做的时候yy各种贪心,结果一直WA
可能是情况考虑不全吧
改成暴力枚举就过了
#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; }