博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
阅读量:6258 次
发布时间:2019-06-22

本文共 1024 字,大约阅读时间需要 3 分钟。

非常简单的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 
#include
#include
using namespace std;//最长公共子序列长度 LCS dpchar 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<
<

 

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

你可能感兴趣的文章
知识图谱的应用
查看>>
springboot 系列教程一:基础项目搭建
查看>>
Rxjava2 源码解析 (三)
查看>>
ios cocoapods 0.32.1 升级提示不行 要安装cocoapods-core
查看>>
匿名函数和闭包
查看>>
Overfitting
查看>>
Open vSwitch 简介
查看>>
Composer
查看>>
Go Little Book - 关于本书
查看>>
Java 反斜杠如何转义的问题
查看>>
关于POJO类
查看>>
inline函数
查看>>
mysql 5.7 修改初始密码
查看>>
修改Mac OS X的hosts文件
查看>>
表单提交时的非法性有效性验证
查看>>
李开复:21世纪最需要的7种人才
查看>>
opencsv
查看>>
单词匹配二
查看>>
关于代码生成器的理解
查看>>
Spiral Matrix
查看>>