码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4433

时间:2015-11-04 21:19:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

//先放这里 还没太懂

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int INF = 0x3f3f3f3f;
const int MAX = 1100;

int up[15][15];
int down[15][15];
char s[MAX],t[MAX];
int dp[MAX][11][11];

void init()
{//可能出现的转的情况提前计算
    for(int i = 0 ; i <= 9; ++i)
        for(int j = 0; j <= 9; ++j){
            up[i][j] = (j - i + 10) % 10;
            down[i][j] = (i - j + 10) % 10;
        }
}
int main(void)
{
    //freopen("input.txt","r",stdin);
    init();
    while(scanf("%s%s",s,t) != EOF){
        int n = strlen(s);
        s[n] = s[n+1] = t[n] = t[n+1] =‘0‘;//为了处理方便,多加两个元素
        for(int i = 0; i < n + 2; ++i)
            s[i] -= ‘0‘,t[i] -= ‘0‘;
        memset(dp,0x3f,sizeof(dp));
        dp[0][s[0]][s[1]] = 0;//除了最初的序列,其他的dp都没有合法值
        for(int i = 1; i <= n; ++i){//从i到n递推
            for(int j = 0; j <= 9; ++j){//枚举两位数字的每一位
                for(int k = 0; k <= 9; ++k){

                    int t1 = up[j][t[i-1]];//将三位中最左边的数字向上转到目标序列需要的操作
                    for(int u = 0; u <= t1; ++u)//枚举可能出现的操作
                        for(int v = 0; v <= u; ++v)
                            dp[i][(k + u) % 10][(s[i+1] + v) % 10] =
                            min(dp[i][(k + u) % 10][(s[i+1] + v) % 10], dp[i-1][j][k] + t1);

                    int t2 = down[j][t[i-1]];//将三位中最左边的数字向下转到目标徐磊需要的操作
                    for(int u = 0; u <= t2; ++u)//枚举可能出现的操作
                        for(int v = 0; v <= u; ++v)
                            dp[i][(k - u + 10) % 10][(s[i+1] - v + 10) % 10] =
                            min(dp[i][(k - u + 10) % 10][(s[i+1] - v + 10) % 10], dp[i-1][j][k] + t2);
                }
            }
        }
        printf("%d\n",dp[n][0][0]);
    }
    return 0;
}



HDU 4433

标签:

原文地址:http://www.cnblogs.com/airot/p/4937319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!