您的位置:首页 > 其它

POJ 1080 Human Gene Functions

2010-12-28 10:28 393 查看
解题思路:类LCS

opt[i][j]表示第一个字符的前i个字符与第二个字符前j个字符的最大匹配值

// opt[i][j]=max{opt[i-1][j-1]+w(i,j), opt[i-1][j]+w(j,-), opt[i][j-1]+w(i,-)}

#include <iostream>
using namespace std;
inline int ctoi(char c)
{
switch (c)
{
case 'A': return 0;
case 'C':return 1;
case 'G':return 2;
default:return 3;
}
}
int main()
{
char ci[101];
int i,j,k,n,a,b,s,ai,bi,p[100],q[100],opt[2][101];
const int map[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};
scanf("%d", &n);
while(n--)
{
memset(opt, 0, sizeof(opt));
scanf("%d %s", &a, ci);for(i=0;i<a;i++)p[i]=ctoi(ci[i]);
scanf("%d %s", &b, ci);for(i=0;i<b;i++)q[i]=ctoi(ci[i]);
for(i=1;i<=b;i++)opt[0][i]=opt[0][i-1]+map[4][q[i-1]];
for(ai=0,bi=i=1;i<=a;i++,j=ai,ai=bi,bi=j)
for(opt[bi][0]=opt[ai][0]+map[4][p[i-1]],j=1;j<=b;j++)
{
k=p[i-1],s=q[j-1];
opt[bi][j]=max(opt[ai][j]+map[4][k], opt[bi][j-1]+map[4][s]);
opt[bi][j]=max(opt[bi][j], opt[ai][j-1]+map[k][s]);
}
printf("%d\n", opt[ai][b]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: