【算法基础(第五版)】例3.13 序列对准求最小值

博客探讨了在序列对准问题中,如何使用动态规划算法寻找两个同源DNA序列的最佳对准方式,以求得最小罚分值。通过对不同对准情况的分析,得出递推公式,并说明了如何从矩阵的终点逆向获取最优路径。
摘要由CSDN通过智能技术生成

算法基础(第五版)之序列对准
题目背景,给出两个同源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);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值