HDU 4433

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值