传送门:Human Gene Functions
题意:给你两个基因序列,你可以添加-,使得这两个序列相等且匹配值最大。匹配值计算见题目图片。
思路:类似于LCS,dp[i][j]代表a字符串匹配到i,b字符串匹配到j时,最大的匹配值。
在这里我们只考虑三种情况:
1.a[i]与’-‘匹配时,dp[i][j]=dp[i-1][j]+val(a[i],’-‘)
2.a[i]与b[j]匹配时,dp[i][j]=dp[i-1][j-1]+val(a[i],b[i])
3.’-‘与b[j]匹配时,dp[i][j-1]+val(b[j],’-')
在这里要注意怎么初始化,具体见代码。
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[105][105];
char a[105],b[105];
int t[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 getid(char c)
{
if(c=='A') return 0;
if(c=='C') return 1;
if(c=='G') return 2;
if(c=='T') return 3;
if(c=='-') return 4;
}
int val(char x,char y)
{
int xx=getid(x);
int yy=getid(y);
return t[xx][yy];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n_a,n_b;
scanf("%d",&n_a);
scanf("%s",a+1);
scanf("%d",&n_b);
scanf("%s",b+1);
dp[0][0]=0;
for(int i=1;i<=n_b;i++)
dp[0][i]=dp[0][i-1]+val(b[i],'-');
for(int i=1;i<=n_a;i++)
dp[i][0]=dp[i-1][0]+val(a[i],'-');
for(int i=1;i<=n_a;i++)
{
for(int j=1;j<=n_b;j++)
{
dp[i][j]=max(dp[i-1][j-1]+val(a[i],b[j]),max(dp[i-1][j]+val(a[i],'-'),dp[i][j-1]+val(b[j],'-')));
}
}
printf("%d\n",dp[n_a][n_b]);
}
return 0;
}