Pku acm 1080 Humman Gene Function 动态规划题目解题报告(八)

来源:互联网 发布:tango软件好不好 编辑:程序博客网 时间:2024/05/21 11:05

http://acm.pku.edu.cn/JudgeOnline/problem?id=1080

这是一道比较经典的DP,两串基因序列包含ACGT,每两个字母间的匹配都会产生一个相似值,求基因序列(字符串)匹配的最大值。

这题有点像求最长公共子序列。只不过把求最大长度改成了求最大的匹配值。用二维数组opt[i][j]记录字符串a中的前i个字符与字符串b中的前j个字符匹配所产生的最大值。假如已知AGGT的最大匹配值,AGTGT的最大匹配值,AGGTT的最大匹配值,求AGTGTT的最大匹配值,这个值是AGGT的最大匹配值加上T T的匹配值,AGTGT的最大匹配值加上T -的匹配值,AGGTT的最大匹配值加上-T的匹配值中的最大值,所以状态转移方程:

opt[i][j] = max(opt[i-1][j-1]+table(b[i-1],a[j-1]),opt[i][j-1]+table('-',a[j-1]),opt[i-1][j]+table('-',b[i-1]));

 

Null

A

G

T

G

A

T

G

Null

 

-3

-5

-6

-8

-11

-12

-14

G

-2

 

 

 

 

 

 

 

T

-3

 

 

 

 

 

 

 

T

-4

 

 

 

 

 

 

 

A

-7

 

 

 

 

 

 

 

G

-9

 

 

 

 

 

 

 

0行,第0列表示null和字符串匹配情况,结果是’-’和各个字符的累加:     

 opt[num2][num1]即为所求结果。

for(i=1;i<=num1;i++)

            opt[0][i] = opt[0][i-1]+table('-',a[i-1]);

 for(i=1;i<=num2;i++)

            opt[i][0] = opt[i-1][0]+table('-',b[i-1]);

 

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得

 
原创粉丝点击