hdu4433 locker(dp)

hdu4433

题目

给出两个串,每次可以选择连续的1-3个数字,进行同时加1或者同时减1,问最少经过多少次操作,将一个串转变为另外一个串.

思路

dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经加了k,转移分为两步,枚举加,枚举减,感觉还是不怎么能接受。。。
http://blog.csdn.net/acm_cxlove/article/details/8124726

代码

#include 
#include 
#include 
#include 

using namespace std;

const int maxn=1000+10;
const int inf=0x3f3f3f3f;

int dp[maxn][10][10];
char s1[maxn],s2[maxn];

int main()
{
    while(scanf("%s %s",s1,s2)!=EOF)
    {
        int len=strlen(s1);
        memset(dp,0x3f,sizeof(dp));
        dp[0][0][0]=0;
        for(int i=0; ifor(int j=0; j<10; j++)
                for(int k=0; k<10; k++)
                {
                    if(dp[i][j][k]!=inf)
                    {
                        int t=(s2[i]-s1[i]-j+20)%10;
                        for(int a=0; a<=t; a++)
                            for(int b=0; b<=a; b++)
                                dp[i+1][(k+a)%10][b]=min(dp[i+1][(k+a)%10][b],dp[i][j][k]+t);
                        t=(10-t)%10;
                        for(int a=0; a<=t; a++)
                            for(int b=0; b<=a; b++)
                                dp[i+1][(k-a+10)%10][(10-b)%10]=min(dp[i+1][(k-a+10)%10][(10-b)%10],dp[i][j][k]+t);
                    }
                }
        printf("%d\n",dp[len][0][0]);
    }
    return 0;
}

你可能感兴趣的:(hdu4433 locker(dp))