首页 > 代码库 > poj 1080 Human Gene Functions (dp,LCS)
poj 1080 Human Gene Functions (dp,LCS)
链接:poj 1080
题意:给定两个字符串,求它们对齐匹配的最大值
要求:可以两个字符匹配,也可以一个字符和‘-’匹配,
但是不能两个‘-’匹配,例如:
AGTGATG
GTTAG
这两个字符串可以看成是
AGTGATG
-GTTA-G
也可以看成是
AGTGAT-G
-GT--TAG
分析:这是一个变形的最长公共子序列,最优解:
1.取字符i-1和j-1的时候dp[i][j]=dp[i-1][j-1]+a[s1[i-1]][s2[j-1]];
2.取字符i-1,不取j-1的时候dp[i][j]=dp[i-1][j]+a[s1[i-1]][‘-‘];
3.取字符j-1,不取i-1的时候dp[i][j]=dp[i][j-1]+a[‘-‘][s2[j-1]];
而dp[i][j]取这三个值的最大值就可以了
当然初始化的时候dp[0][0]=0;
但是因为每个字符都要和一个字符对齐,当然不包括‘-‘和‘-‘两个字符对齐
所以当dp[0][i]的时候就代表s2[i-1]与‘-‘对齐,
所以dp[0][j]=dp[0][j-1]+a[‘-‘][s2[j-1]];
同理dp[i][0]=dp[i-1][0]+a[s1[i-1]][‘-‘];
#include<stdio.h> int dp[105][105],m,n; char s1[105],s2[105]; int a[5][5]={5,-1,-2,-1,-3,-1,5,-3,-2,-4,-2,-3,5,-2,-2,-1,-2,-2,5,-1,-3,-4,-2,-1,0}; int getid(char c) { if(c=='A') return 0; if(c=='C') return 1; if(c=='G') return 2; if(c=='T') return 3; if(c=='-') return 4; } int max(int a,int b,int c) { int k=a; if(b>k) k=b; if(c>k) k=c; return k; } void my_dp() { int i,j,dp1,dp2,dp3; dp[0][0]=0; for(i=1;i<=m;i++) dp[i][0]=dp[i-1][0]+a[getid(s1[i-1])][getid('-')]; for(j=1;j<=n;j++) dp[0][j]=dp[0][j-1]+a[getid('-')][getid(s2[j-1])]; for(i=1;i<=m;i++) for(j=1;j<=n;j++){ dp1=dp[i-1][j-1]+a[getid(s1[i-1])][getid(s2[j-1])]; dp2=dp[i-1][j]+a[getid(s1[i-1])][getid('-')]; dp3=dp[i][j-1]+a[getid('-')][getid(s2[j-1])]; dp[i][j]=max(dp1,dp2,dp3); } } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d%s%d%s",&m,s1,&n,s2); my_dp(); printf("%d\n",dp[m][n]); } return 0; }
poj 1080 Human Gene Functions (dp,LCS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。