标签:
//先放这里 还没太懂
#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; }
标签:
原文地址:http://www.cnblogs.com/airot/p/4937319.html