您的位置:首页 > 其它

【DP 训练】Locker, Tianjin 2012, UVa1631

2016-10-09 14:48 417 查看
#include<bits/stdc++.h>
using namespace std;
#define maxn 1010
int len;char s1[maxn],s2[maxn];
int dp[maxn][15][15],a[maxn],b[maxn];
//dp(i,x,y)表示翻到i位第i+1位为x,第i+2位为y的最小步数,枚举上翻状态,找到正翻和倒翻的最小值。
int main()
{
ios::sync_with_stdio(false);
while(cin>>s1+1>>s2+1)
{
len = strlen(s1+1);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=len;i++)
a[i] = s1[i]-'0',b[i] = s2[i]-'0';
a[len+1]=b[len+1]=a[len+2]=b[len+2]=0;
dp[0][a[1]][a[2]] = 0;
for(int i=1;i<=len;i++)
{
for(int x=0;x<=9;x++)
{
for(int y=0;y<=9;y++)
{//@枚举dp[i-1][x][y] => dp[i][change(x)][change(y)]
int d = (b[i]-x+10)%10;//x上翻到目标状态的补数
for(int j=0;j<=d;j++)
{
for(int k=0;k<=j;k++)
{
dp[i][(y+j)%10][(a[i+2]+k)%10]=min(dp[i][(y+j)%10][(a[i+2]+k)%10],dp[i-1][x][y]+d);
}
}
d = 10-d;//下翻
for(int j=0;j<=d;j++)
{
for(int k=0;k<=j;k++)
{
dp[i][(y-j+10)%10][(a[i+2]-k+10)%10]=min(dp[i][(y-j+10)%10][(a[i+2]-k+10)%10],dp[i-1][x][y]+d);
}
}

}

}

}
cout<<dp[len][0][0]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DP 动态规划 uva