POJ 3356.AGTC(DP)
2015-07-27 14:44
225 查看
问题简述:
输入两个序列x和y,分别执行下列三个步骤,将序列x转化为y
(1)插入;(2)删除;(3)替换;
要求输出最小操作数。
原题链接:http://poj.org/problem?id=3356
解题思路:
明显的动态规划题,输入两个字符串 a[0...m-1] , b[0...n]
使用二维数组 dp[i,j] 记录 a[0...i] 和 b[0...j] 对应的最小操作数
显然有以下递归方程:
dp[i,0] = i
dp[0,j] = j
dp[i,j] = dp[i-1,j-1] if a[i-1]==b[j-1]
dp[i,j] = min(dp[i-1,j-1],dp[i-1,j],dp[i,j-1]) + 1 if a[i-1]!=b[j-1]
源代码:
输入两个序列x和y,分别执行下列三个步骤,将序列x转化为y
(1)插入;(2)删除;(3)替换;
要求输出最小操作数。
原题链接:http://poj.org/problem?id=3356
解题思路:
明显的动态规划题,输入两个字符串 a[0...m-1] , b[0...n]
使用二维数组 dp[i,j] 记录 a[0...i] 和 b[0...j] 对应的最小操作数
显然有以下递归方程:
dp[i,0] = i
dp[0,j] = j
dp[i,j] = dp[i-1,j-1] if a[i-1]==b[j-1]
dp[i,j] = min(dp[i-1,j-1],dp[i-1,j],dp[i,j-1]) + 1 if a[i-1]!=b[j-1]
源代码:
/* OJ: POJ ID: 3013216109 TASK: 3356.AGTC LANG: C++ NOTE: DP */ #include <cstdio> const int MAX=1005; int m,n,i,j,k; char a[MAX],b[MAX]; int dp[MAX][MAX],c[MAX]; int min(int x,int y,int z) { if(x<+y&&x<=z) return x; if(y<=x&&y<=z) return y; if(z<=x&&z<=y) return z; } int main() { while(scanf("%d %s",&m,a)!=EOF) { scanf("%d %s",&n,b); for(i=0;i<=m;i++) dp[i][0]=i; for(j=0;j<=n;j++) dp[0][j]=j; k=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]; else dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1; } } printf("%d\n",dp[m] ); } return 0; }
相关文章推荐
- TOJ 1139.Compromise(LCS DP)
- POJ 1256.Anagram(DFS和STL)
- POJ 1014.Dividing(DFS)
- POJ 3368.Frequent values(RMQ和线段树)
- Android百度地图的简单实现
- Laravel5 学习与使用(一)
- PHP-购物网站开发设计(一)
- PHP-购物网站开发设计(二)
- POJ 2442.Sequence
- HDOJ 1308.Is It A Tree?
- Objective-C中@property的所有属性详解
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- hdu 1203 I NEED A OFFER!(01背包)
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- 判断是否是在手机登陆
- ds.Merge 与 ds.Tables[0].Merge 的用法
- 微信公众号开发之微信模板消息
- 修改用户密码引来的一系列麻烦
- 3.7-磁盘格式化 mke2fs
- iOS自学---彩票App第一天