#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=1005;
const int INF=1000000;
char s[maxn],t[maxn];
int dp[maxn][11][11];
//dp[i][j][k]表示前i位,第i位状态为j,i+1状态为k
//前i-1位对第i位的影响最多为 第i位,第i+1位只要记录前i-1对第i位的影响状态即可
int n;
void Min(int &a,int b){
if(a>b)a=b;
}
int Gao(int x,int y){
int ret=0;
while(x!=y){
x++;
ret++;
if(x>=10)x=0;
}
return ret;
}
int Kao(int x,int y){
int ret=0;
while(x!=y){
x--;
ret++;
if(x<0)x=9;
}
return ret;
}
int m1[15][15];
int m2[15][15];
void init(){
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++){
m1[i][j]=Gao(i,j);
m2[i][j]=Kao(i,j);
}
}
int main(){
int i,j,k,jj,kk;
init();
while(scanf("%s%s",s,t)!=EOF){
n=strlen(s);
s[n]=s[n+1]=t[n]=t[n+1]='0';
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][s[0]-'0'][s[1]-'0']=0;
for(i=1;i<=n;i++){
for(j=0;j<10;j++)
for(k=0;k<10;k++){
int t1=m1[j][t[i-1]-'0'];
for(jj=0;jj<=t1;jj++)
for(kk=0;kk<=jj;kk++){
Min(dp[i][(k+jj)%10][(s[i+1]-'0'+kk)%10],dp[i-1][j][k]+t1);
}
int t2=m2[j][t[i-1]-'0'];
for(jj=0;jj<=t2;jj++)
for(kk=0;kk<=jj;kk++){
Min(dp[i][(k-jj+10)%10][(s[i+1]-'0'-kk+10)%10],dp[i-1][j][k]+t2);
}
}
}
printf("%d\n",dp[n][0][0]);
}
return 0;
}
HDU locker 4433
最新推荐文章于 2017-10-07 16:16:11 发布