HDU 4433

这个题我做的时候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;

}


 

 

你可能感兴趣的:(HDU)