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或者同时减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 */
相关文章推荐
- 【HDU - 4622】Reincarnation 【字符串HASH+dp 】
- HDU 4433 类似于状态压缩的DP
- Hdu 4433 locker【思维+Dp】
- ZOJ1733 | | HDU1159简单的DP求两个字符串最大子序列的长度,没啥好说的,照着书上敲得。
- HDU 4622 Reincarnation(字符串hash,hashMap,区间dp)
- HDU 4433 类似于状态压缩的DP
- HDU 4433 locker(DP)
- HDU 4433 locker(DP)( UVA 1631 - Locker)
- HDU 4433 locker(SPFA+DP)
- hdu 4433 locker(DP)
- 字符串练习题: 【HDU 2457】 DNA repair(AC自动机+DP)
- HDU 4433 locker(三维dp)
- hdu 1159(DP+字符串最长公共序列)
- HDU 4433 locker(DP)(2012 Asia Tianjin Regional Contest)
- [HDU 4433]locker[DP]
- HDU 4433 locker(12年天津,DP)
- HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)
- HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
- hdu 4433 locker (dp)
- hdu 4632 子字符串统计的区间dp