poj 1080 Human Gene Functions(dp)
2013-10-28 20:44
399 查看
题目:http://poj.org/problem?id=1080
题意:比较两个基因序列,测定它们的相似度,将两个基因排成直线,如果需要的话插入空格,使基因的长度相等,然后根据那个表格计算出相似度。
题解:
考虑f[i][j]:
① s1取第i个,s2取第j个, f[i][j] = f[i-1][j-1]+value[m(s1[i])][m(s2[j])];
② s1取第i个,s2用’-’, f[i][j] = f[i][j-1]+value[m(s1[i])][m(‘-’)];
③ s1用’-’,s2取第j个, f[i][j] = f[i-1][j]+value[m(‘-’)][m(s2[j])];
f[i][j] 为三者中最大者
考虑边界条件,即i或j为0的情况:
① 当i=j=0时,根据f[1][1] = f[0][0]+value[m(s1[i])][m(s2[j])],有f[0][0] = 0;
② 当i=0时,用f[0][j] = f[0][j-1]+ value[m(‘-’)][m(s2[j])]计算
③ 当j=0时,用f[i][0] = f[i-1][0]+ value[m(s1[i])][m(‘-’)]计算
题意:比较两个基因序列,测定它们的相似度,将两个基因排成直线,如果需要的话插入空格,使基因的长度相等,然后根据那个表格计算出相似度。
题解:
考虑f[i][j]:
① s1取第i个,s2取第j个, f[i][j] = f[i-1][j-1]+value[m(s1[i])][m(s2[j])];
② s1取第i个,s2用’-’, f[i][j] = f[i][j-1]+value[m(s1[i])][m(‘-’)];
③ s1用’-’,s2取第j个, f[i][j] = f[i-1][j]+value[m(‘-’)][m(s2[j])];
f[i][j] 为三者中最大者
考虑边界条件,即i或j为0的情况:
① 当i=j=0时,根据f[1][1] = f[0][0]+value[m(s1[i])][m(s2[j])],有f[0][0] = 0;
② 当i=0时,用f[0][j] = f[0][j-1]+ value[m(‘-’)][m(s2[j])]计算
③ 当j=0时,用f[i][0] = f[i-1][0]+ value[m(s1[i])][m(‘-’)]计算
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int mmax(int a,int b,int c) { if(a>=b&&a>=c) return a; if(b>=a&&b>=c) return b; if(c>=a&&c>=b) return c; } int f[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 tran(char ch) { switch(ch) { case 'A':return 0; break; case 'C':return 1; break; case 'G':return 2; break; case 'T':return 3; break; case '-':return 4; } } int d[110][110]; int main() { int t,i,j,m,n; char a[110],b[110]; cin>>t; while(t--) { memset(d,0,sizeof(d)); cin>>m; getchar(); cin>>a; cin>>n; getchar(); cin>>b; d[0][0]=0; for(j=1; j<=n; j++) d[0][j]=f[tran('-')][tran(b[j-1])]+d[0][j-1];//这里刚开始求成了最大的,其实应该是每一个的- 与 //每一个的字符串匹配后的值, 而后面循环里的每一个d【i】[j]实际都有相同的字符,不足的是- 补全的。 for(i=1; i<=m; i++) d[i][0]=f[tran(a[i-1])][tran('-')]+d[i-1][0]; for(i=1; i<=m; i++) for(j=1; j<=n; j++) { d[i][j]=mmax(f[tran(a[i-1])][tran(b[j-1])]+d[i-1][j-1],f[tran('-')][tran(b[j-1])]+d[i][j-1], f[tran(a[i-1])][tran('-')]+d[i-1][j]);// 因为输入的原因,d 和 a. b 相差 一 } cout<<d[m] <<endl; } return 0; }
相关文章推荐
- POJ 1080 Human Gene Functions(dp)
- POJ 1080-Human Gene Functions(dp)
- POJ 1080-Human Gene Functions(DP)
- poj--1080 Human Gene Functions(dp)
- POJ-1080 Human Gene Functions DP
- POJ-1080 Human Gene Functions(DP)
- POJ 1080 Human Gene Functions(字符串匹配得分,dp)
- 【dp】POJ - 1080 Human Gene Functions
- POJ 1080-Human Gene Functions(DP:LCS变型)
- POJ 1080 Human Gene Functions (DP)
- poj 1080 Human Gene Functions DP
- POJ 1080 Human Gene Functions(DP:LCS)
- POJ 1080 Human Gene Functions DP
- POJ 1080 && HDU 1080 Human Gene Functions(dp)
- POJ 1080 Human Gene Functions(DP LCS)
- POJ 1080 Human Gene Functions(DP)
- 【poj 1080】Human Gene Functions DP(类最长公共子序列*)
- poj_1080 Human Gene Functions(dp)
- POJ-1080-Human Gene Functions-LCS变体,动态规划,DP
- Human Gene Functions poj 1080 dp