码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-15 10:50:40      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

非常简单的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;
}

 

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

标签:

原文地址:http://www.cnblogs.com/yuchenlin/p/sjtu_oj_1065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!