算法基础(第五版)之序列对准
题目背景,给出两个同源DNA序列,不匹配罚一分,有缝隙(即一个字母对应一个短线)罚两分,例如:
对于序列AACAGTTACC和TAAGGTCA,
-AACAGTTACC和TAA-GGT–CA是一种对准方式,
AACAGTTACC和TA-AGGT-CA是另一种对准方式,第一种罚分数为1*2+2*4=10,第二种为1*3+2*2=7,第二种方式比第一种好,对准方式有很多种,如何找到最好的对准方式及求出最小罚分值。
思路:m[i][j]表示从s1的第i个位置和从s2的第j个位置开始对准最低罚分值,进而得到递推公式
若s1[i]==s2[j],
则m[i][j]=min(m[i+1][j]+2,m[i][j+1]+2,m[i+1][j+1])
若不等,
则m[i][j]=min(m[i+1][j]+2,m[i][j+1]+2,m[i+1][j+1]+1)
解释如下:对于s1的第i个字母和s2[j],可以s1[i]与s2[j]对准,可以S1[i]与‘-’对准,和s2[j]与‘-’对准。
从m[len1][len2]开始斜对角线递推至m[0][0]即为总最小惩罚值,路径根据打表之后从m[0][0]对比变化得知。代码如下:
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
char s1[50];
char s2[50];
scanf("%s%s",s1,s2);