【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1

本文深入探讨了动态规划算法在解决DNA序列比对问题时的运用,详细介绍了如何通过构建状态转移矩阵来计算两段DNA序列之间的相似度。包括基本原理、实现步骤以及代码实例,旨在帮助读者掌握这一核心算法在生物信息学领域的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非常简单的DP

如果dp[i,j]表示从0到i 和 从0到j 这两段的相似度,

那么可以知道每个dp[i,j]是由三种状态转化过来的

第一种 当dna1[i]==dna2[j]的时候

 

dp[i-1,j-1] +  1  长度加1

第二种  否则 从下面两个状态过来那就是

dp[i][j-1] 和 dp[i-1][j]//注意因为是顺序遍历 这两个都已经计算过

取两者最大即可。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

//最长公共子序列长度 LCS dp

char dna1[1000+10];
char dna2[1000+10];
int len1 , len2;

int dp[1000+10][1000+10];
//表示dna1 从第1位到i 和 dna2 从第一位到j的 相似度


void init(){
    cin>>dna1;
    cin>>dna2;
    len1 = strlen(dna1);
    len2 = strlen(dna2);
}

int build(){
    memset(dp,0,sizeof(dp));
    for (int i = 1; i <= len1; ++i){
        for (int j= 1; j <= len2; ++j){
            bool ok = (dna1[i-1]==dna2[j-1]);
            dp[i][j]= max(
                dp[i-1][j-1] + ok,
                max(
                dp[i-1][j],
                dp[i][j-1]
                )
                );

        }
    }
    return dp[len1][len2];
}


int main(int argc, char const *argv[])
{
    init();
    cout<<build()<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值