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

来源:互联网 发布:数据库故障应急预案 编辑:程序博客网 时间:2024/05/01 16:55

【题目】:问题 B:  Human Gene Functions

【来源】:点击打开链接

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

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

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;}


 

原创粉丝点击