POJ 1080 Human Gene Functions C++版
题目链接:http://poj.org/problem?id=1080
不错的DP题,做了好多DP了,越做越觉得DP思路真的很开阔,以后还要加强,这题我参考的别人的解题报告,加以自己的想法。
解释下题意,两个字符串,通过增加空格来调整字符串,使得对应字符得到的数相加最大,比如题目中的
AGTGATG
-GTTA-G
第二列解释通过增加两个空格才和第一列对应的,一一对应关系参照
可得到最大的得分(-3)+5+5+(-2)+5+(-1) +5=14
我们可以看到,相同的字符是得分最大的,那么我们可以想到LCS问题,这题也算是LCS的一种变形。
解释下DP思路,dp[i][j]记录第一列i个字符和第2列j个字符开始的最大得分,这个得分也就是前面可能的三种情况的最大值!我们来举个例子:
比如i和j分别指字符G,C
那么有三种情况:
GXXX
CXXX
那么dp[i][j]=dp[i-1][j-1]+getmatch(str1[i-1],str2[j-1])
-GXX
CXXX
那么dp[i][j]=dp[i][j-1]+getmatch(str2[j-1],’-‘)
GXXX
-CXX
那么dp[i][j]=dp[i-1][j]+getmatch(str1[i-1],’-‘)
这样由dp[0][0]开始动态规划下去就是了,其中还要注意i,j分别等于0的情况,一面i-1,j-1不存在。
代码种getnum函数将字符转换数字getmatch将组合转换成得分
具体见代码:
1 | /*************************************** |