hdu4433(三維DP,後效性)

題意:給你個長度爲n的數字串,每次最多旋轉三個數字,至少經過都少部才能到達目標串。

思路:一開始我也是用DP做的,但是沒考慮到後效性,所以wa了。後來看了題解,思路是這樣的dp[i][j][k]表示第i爲匹配好,第i+1位增加了j,第i+2增加了k。狀態轉移:第i+2位增加k+x,第i+3位增加y,然後還要考慮到減的情況。

代碼如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>
#include<math.h>

#define N 1005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
char a[N],b[N];
int dp[N][15][15];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
    while(scanf("%s%s",a,b) != EOF)
    {
        int i,j,k;
        int n = strlen(a);
        for(i = 0; i <= n; i++)
            for(j = 0; j < 10; j++)
                for(k = 0; k < 10; k++)
                    dp[i][j][k] = inf;
        dp[0][0][0] = 0;
        for(i = 0; i < n; i++)
            for(j = 0; j < 10; j++)
                for(k = 0; k < 10; k++)
                    if(dp[i][j][k] != inf)
                    {
                        int x,y;
                        int t = (b[i] - a[i] - j + 20)%10;
                        for(x = 0; x <= t; x++)
                            for(y = 0; y <= x; y++)
                                dp[i+1][(k+x)%10][y] = min(dp[i+1][(k+x)%10][y], dp[i][j][k]+t);

                        t = (10-t);
                        for(x = 0; x <= t; x++)
                            for(y = 0; y <= x; y++)
                                dp[i+1][(k-x+10)%10][(10-y)%10] = min(dp[i+1][(k-x+10)%10][(10-y)%10], dp[i][j][k]+t);
                    }
        printf("%d\n",dp[n][0][0]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章