动态规划二:最长公共子序列(LCS)
1.两个子序列:X={x1,x2....xm},Y={y1,y2....yn},设Z={z1,z2...zk}。
2.最优子结构:
1)如果xm=yn ,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS。
2)如果xm!=yn ,则zk!=xm包含Z是Xm-1和Y的一个LCS。
3)如果xm!=yn ,则zk!=yn包含Z是X和Yn-1的一个LCS。
3.则由最优子结构可得递归式:
aaarticlea/png;base64,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" alt="" />
4.实现:
#include<string>
#include<iostream>
using namespace std; int arr[][] = {};
void LCS(string str1, string str2){
int len1 = str1.length();
int len2 = str2.length();
//边界
for (int i = ; i <= len1; i++)
arr[i][] = ;
for (int j = ; j <= len2; j++)
arr[][j] = ;
//检验
for (int i = ; i <= len1; i++)
{
for (int j = ; j <= len2; j++)
{
if (str1[i - ] == str2[j - ]) //记录
{
arr[i][j] = arr[i - ][j - ] + ;
}
else if (arr[i][j - ] >= arr[i - ][j])
{
arr[i][j] = arr[i][j - ];
}
else
{
arr[i][j] = arr[i - ][j];
}
}
}
} void printLCS(string str1, string str2,int len1, int len2){
cout << "最长公共子序列长为:" << arr[len1][len2] << endl;
//倒序输出
while (len1&&len2){
if (str1[len1-]==str2[len2-])
{
cout << str1[len1 - ];
len1--;
len2--;
}
else if (arr[len1][len2-]>=arr[len1-][len2])
{
len2--;
}
else{
len1--;
}
}
cout << endl;
} int main()
{
string str1 = "abcdsnnnn";
string str2 = "acbdanm";
LCS(str1, str2);
printLCS(str1, str2,str1.length(), str2.length());
return ;
}
动态规划二:最长公共子序列(LCS)的更多相关文章
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 每日一题-——最长公共子序列(LCS)与最长公共子串
最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...
- 51nod 1006:最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
随机推荐
- linux kernel 关于RSS/RPS/RFS/XPS的介绍
Introduction============ This document describes a set of complementary techniques in the Linuxnetwo ...
- 获取本地ip地址 C#
与ipconfig获取的所有信息一致的方法: private void GetIp() { System.Diagnostics.Process cmdp= new System.Diagnostic ...
- PHP代码优化小笔记
1.十万级以上次执行情况,方法可以被静态化,考虑声明为静态.html静态页面速度更快 2.echo 替换print:echo时逗号连接符替换点号连接符 3.循环之前设置循环最大次数,循环参数不要使用函 ...
- canvas知识02:图片放大镜效果
效果截图: JS代码: <script> // 初始化canvas01和上下文环境 var cav01 = document.getElementById('cav01'); var cx ...
- js点亮星星评分并获取参数的js代码
点亮星星评分后,点击按钮,立即获得分数参数值,方便不想使用ajax传参的朋友 http://demo.jb51.net/js/2014/jsxxdf/demo2.html <!DOCTYPE h ...
- HDU2546饭卡---(DP 经典背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory L ...
- 动态规划:状压DP
状压DP可以用在NP问题的小规模求解中(不理解,感觉和可以搜索的题很类似) 如果状态是个网格,数据范围很小,基本锁定状压DP 例题是BZOJ1725 题意是这样的,给定一个黑白图,然后种田,要求田与田 ...
- Python基础(8)迭代器、生成器
一 什么是迭代 1 重复 2 下一次重复是基于上一次的结果 # while True: # cmd=input('>>: ') # print(cmd) # l=['a','b','c', ...
- flume高级组件及各种报错
1,one source two channel 创建conf文件,内容如下: #定义agent名, source.channel.sink的名称 access.sources = r1 access ...
- WEB API 版本控制
参照 http://blog.csdn.net/hengyunabc/article/details/20506345