POJ 3356 AGTC
来源:互联网 发布:featutelayer json 编辑:程序博客网 时间:2024/05/22 12:03
Description
Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below:
- Deletion: a letter in x is missing in y at a corresponding position.
- Insertion: a letter in y is missing in x at a corresponding position.
- Change: letters at corresponding positions are distinct
Certainly, we would like to minimize the number of all possible operations.
IllustrationA G T A A G T * A G G C| | | | | | |A G T * C * T G A C G CDeletion: * in the bottom line
Insertion: * in the top line
Change: when the letters at the top and bottom are distinct
This tells us that to transform x = AGTCTGACGC into y = AGTAAGTAGGC we would be required to perform 5 operations (2 changes, 2 deletions and 1 insertion). If we want to minimize the number operations, we should do it like
A G T A A G T A G G C| | | | | | |A G T C T G * A C G C
and 4 moves would be required (3 changes and 1 deletion).
In this problem we would always consider strings x and y to be fixed, such that the number of letters in x is m and the number of letters in y is n where n ≥ m.
Assign 1 as the cost of an operation performed. Otherwise, assign 0 if there is no operation performed.
Write a program that would minimize the number of possible operations to transform any string x into a string y.
Input
The input consists of the strings x and y prefixed by their respective lengths, which are within 1000.
Output
An integer representing the minimum number of possible operations to transform any string x into a string y.
Sample Input
10 AGTCTGACGC11 AGTAAGTAGGC
Sample Output
4
LCS可以过,非LCS也可以过=-=
题意:由第一个序列到第二个序列最小操作步数。下面是两种方法。
非LCS:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<limits.h>using namespace std;const int maxn=1100;char s1[maxn],s2[maxn];int dp[maxn][maxn],len1,len2;int main(){ while(~scanf("%d%s",&len1,s1)) { getchar(); scanf("%d%s",&len2,s2); for(int i=0;i<=len1;i++) dp[i][0]=i; for(int i=0;i<=len2;i++) dp[0][i]=i; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++) { if(s1[i]==s2[j]) dp[i+1][j+1]=min(dp[i][j],min(dp[i+1][j]+1,dp[i][j+1]+1)); else dp[i+1][j+1]=min(dp[i][j]+1,min(dp[i+1][j]+1,dp[i][j+1]+1)); } } printf("%d\n",dp[len1][len2]); } return 0;}
LCS:无法证明其正确性,discuss里看到的
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<limits.h>using namespace std;int len1,len2;int dp[1100][1100];char s1[1100],s2[1100];void LCS(){ memset(dp,0,sizeof(dp)); for(int i=1;i<=len1;i++) { for(int j=1;j<=len2;j++) { if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } }}int main(){ while(~scanf("%d%s",&len1,s1)) { getchar(); scanf("%d%s",&len2,s2); LCS(); cout<<max(len1,len2)-dp[len1][len2]<<endl; } return 0;}
- poj 3356 AGTC
- poj 3356 AGTC
- poj 3356 AGTC
- POJ-3356-AGTC
- poj 3356 AGTC
- POJ-3356-AGTC
- POJ 3356 AGTC
- POJ 3356 AGTC.
- POJ-3356-AGTC
- 【POJ 3356】AGTC
- (简单dp) poj 3356 AGTC
- poj 3356 AGTC 【编辑距离】
- poj 3356 AGTC 简单dp
- POJ-3356 AGTC(编辑距离)
- POJ 3356 AGTC(DP)
- POJ-3356(编辑距离)(AGTC)
- poj 3356 AGTC(lcs 变形题)
- [算法] poj 3356 字符串的距离 AGTC
- JPA 注解以及pojo转为表 2
- unity3d之帧动画
- 创建SSL证书,配置IPython notebook服务器
- HDU 4930
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(加密解密题)
- POJ 3356 AGTC
- GGDB常用代码
- URL的应用-多线程下载
- 7.22通过指向对象的指针访问对象中的成员
- 【UNIX——01】APUE第一章
- 安装plymouth
- XML学习
- iOS越狱,插件afc2、afc2add、apple file conduit"2"的区别
- 【索引】Game Theory