您的位置:首页 > 其它

POJ 1080 Human Gene Functions(dp)

2016-08-25 19:20 501 查看
题意:

两个字符串(基因序列),进行分值匹配, 不同字母(基因)匹配有不同分值,可以选择字母与'-'匹配,也有一定分值,最终要求小的字符串在用'-'填充之后去大的字符串长度相等,求总匹配分值最大.

思路:

和最大公共子序列的问题类似,用dp[i][j]表示到字符q[i]和字符p[j]时当前最大分数,

dp[i][j]时可以有三个选择,1.让p[i]和'-'匹配,继承dp[i-1][j]的值再加上a[p[i]['-']的值  ,因为只用到p[i], 所以只有i-1,以下类似.

2.让q[j]和'-'匹配,继承dp[i][j-1]的值加上a['-'][q[j]]的值

3,让q[j]和p[i]匹配,继承dp[i-1][j-1]的值再加上a[p[i][q[j]].

所以dp的转移方程就是dp[i][j]=max(dp[i-1][j]+a[p[i]['-'],dp[i][j-1]+a['-'][q[j]], dp[i][j]+a[p[i][q[j]].

初始化很重要:

dp[0][0]的值为0;

dp[i][0]=dp[i-1][0]+a[p[i]]['-'];

dp[0][i]=dp[0][i-1]+a[q[i]]['-'];

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int a[300][300];
int main()
{
a['A']['A']=a['G']['G']=a['C']['C']=a['T']['T']=5;
a['A']['C']=a['C']['A']=-1;
a['A']['G']=a['G']['A']=-2;
a['A']['T']=a['T']['A']=-1;
a['A']['-']=a['-']['A']=-3;
a['C']['G']=a['G']['C']=-3;
a['C']['T']=a['T']['C']=-2;
a['C']['-']=a['-']['C']=-4;
a['G']['T']=a['T']['G']=-2;
a['G']['-']=a['-']['G']=-2;
a['T']['-']=a['-']['T']=-1;
a['-']['-']=-999999999;
int n;
scanf("%d", &n);
while(n--)
{
int c;
int d;
scanf("%d", &c);
char p[105], q[105];
scanf("%s", p+1);
scanf("%d", &d);
scanf("%s", q+1);
int i, j;
int dp[105][105];
dp[0][0]=0;

for(i=1; i<=d; i++)
dp[0][i]=dp[0][i-1]+a['-'][q[i]];
for(i=1; i<=c; i++)
dp[i][0]=dp[i-1][0]+ a['-'][p[i]];
for(i=1; i<=c; i++)
{
for(j=1; j<=d; j++)
{
dp[i][j]=max(dp[i][j-1]+a[q[j]]['-'], dp[i-1][j]+a['-'][p[i]]);
dp[i][j]=max(dp[i][j], dp[i-1][j-1]+a[q[j]][p[i]]);
}
}
printf("%d\n", dp[c][d]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: