您的位置:首页 > 其它

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(‘-’)]计算

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: