您的位置:首页 > 其它

hdu 4433 字符串变化 DP

2013-01-26 09:59 351 查看
题目:给出两个串,每次可以选择连续的1-3个数字,

进行同时加1或者同时减1,问最少经过多少次操作,将一个串转变为另外一个串

解法:

dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经加了k

转移分为两步,枚举加,枚举减

/*
题目:给出两个串,每次可以选择连续的1-3个数字,
进行同时加1或者同时减1,问最少经过多少次操作,将一个串转变为另外一个串

解法:
dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经加了k

转移分为两步,枚举加,枚举减
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=1<<29;
const int maxn=1002;
int dp[maxn][11][11],n,m;
char s1[maxn],s2[maxn];
int main()
{
//   freopen("//media/学习/ACM/input.txt","r",stdin);
while(scanf("%s%s",s1,s2)!=EOF)
{
int i,j,k,t,m,n,len=strlen(s1);
for(i=0;i<=len;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<len;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<10;k++)
{
t=((s2[i]-s1[i])-j+20)%10;///还需要处理多少次添加的操作
for(m=0;m<=t;m++)///对j UP的次数
{
for(n=0;n<=m;n++)/// 对 k UP的次数
{
dp[i+1][(k+m)%10]
=min(dp[i+1][(k+m)%10]
,dp[i][j][k]+t);
}
}
t=(10-t)%10;///还需要处理多少次减少的操作
for(m=0;m<=t;m++)///对j Down的次数
{
for(n=0;n<=m;n++)/// 对 k Down的次数
{
dp[i+1][(k-m+10)%10][(10-n)%10]=min(dp[i+1][(k-m+10)%10][(10-n)%10],dp[i][j][k]+t);
}
}
}
}
}
cout<<dp[len][0][0]<<endl;
}
return 0;
}
/*
111111 222222
896521 183995
2
12
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: