您的位置:首页 > 其它

Human Gene Functions(最长公共子序列变形题)

2013-07-03 21:54 253 查看
【题目】:问题 B: Human Gene Functions

【来源】:点击打开链接

【解法】:这个题是最长公共子序列的变形题。

1.确定状态:状态表示显然是用二维数组表示DP[i][j]当前i和j对应下最大的权值

2.状态方程:写状态方程根据状态转移的情况不同,可分为从当前状态推下一个状态,还有一种是从后面个状态推前面的状态,具体分情况而定(这个地方还不是理解的很透,具体的刘汝佳的黑书上有,以后看了再补充进来)

这题是由后面的一个状态反推出前一个所有可能状态,转移方程:DP[i][j]=max{ DP[s1[i-1]][s2[j]]+ match[s1[i]][‘-’],

DP[s1[i]][s2[j-1]]+ match[‘-’][s2[j]],

DP[s1[i-1]][s2[j-1]]+match[s1[i]][s2[j]] }

3. 初值: dp[0][0]=0

dp[0][i]=dp[0][i-1]+m['-'][s2[i]]

dp[i][0]=dp[i-1][0]+m[s1[i]]['-']

【代码】:

#include <cstdio>
#include <cstring>

int m[150][150];
int dp[150][150];

int Max(int a,int b,int c)
{
if(a>=b && a>=c) return a;
else if(b>=a && b>=c) return b;
else return c;
}

int main(){
m['A']['A']=5;m['A']['C']=-1;m['A']['G']=-2;m['A']['T']=-1;m['A']['-']=-3;
m['C']['A']=-1;m['C']['C']=5;m['C']['G']=-3;m['C']['T']=-2;m['C']['-']=-4;
m['G']['A']=-2;m['G']['C']=-3;m['G']['G']=5;m['G']['T']=-2;m['G']['-']=-2;
m['T']['A']=-1;m['T']['C']=-2;m['T']['G']=-2;m['T']['T']=5;m['T']['-']=-1;
m['-']['A']=-3;m['-']['C']=-4;m['-']['G']=-2;m['-']['T']=-1;m['-']['-']=0;

int i,j,N;
scanf("%d",&N);
while(N--)
{
char s1[101]={0},s2[101]={0};
int n1,n2;
scanf("%d %s",&n1,s1+1);
scanf("%d %s",&n2,s2+1);

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