POJ 1080 Human Gene Functions

解题思路:类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;
}

 

 

 

posted on 2010-12-28 10:28  ltang  阅读(198)  评论(0编辑  收藏  举报

导航