蓝桥杯 ADV-202算法提高 最长公共子序列(动态规划)
2016-07-21 23:50
357 查看
问题描述
给定两个字符串,寻找这两个字串之间的最长公共子序列。
输入格式
输入两行,分别包含一个字符串,仅含有小写字母。
输出格式
最长公共子序列的长度。
样例输入
abcdgh
aedfhb
样例输出
3
样例说明
最长公共子序列为a,d,h。
数据规模和约定
字串长度1~1000。
分析:求最长公共子序列,用动态规划~只需建立一个长宽为两个字符串长度+1的二维数组~dp[i][j]表示String
a的前i个字符构成的字符串和String b的前j个字符构成的字符串这两者得到的最长公共子序列的长度为dp[i][j]~~~所以第0行和第0列所有的数都为0~
根据递推公式:
最后一个格子的长度就是两个字符串的最长公共子序列的长度~~
给定两个字符串,寻找这两个字串之间的最长公共子序列。
输入格式
输入两行,分别包含一个字符串,仅含有小写字母。
输出格式
最长公共子序列的长度。
样例输入
abcdgh
aedfhb
样例输出
3
样例说明
最长公共子序列为a,d,h。
数据规模和约定
字串长度1~1000。
分析:求最长公共子序列,用动态规划~只需建立一个长宽为两个字符串长度+1的二维数组~dp[i][j]表示String
a的前i个字符构成的字符串和String b的前j个字符构成的字符串这两者得到的最长公共子序列的长度为dp[i][j]~~~所以第0行和第0列所有的数都为0~
根据递推公式:
最后一个格子的长度就是两个字符串的最长公共子序列的长度~~
#include <iostream> using namespace std; int dp[1001][1001]; int main() { string a, b; cin >> a >> b; for(int i = 1; i <= a.length(); i++) { for(int j = 1; j <= b.length(); j++) { if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } cout << dp[a.length()][b.length()]; return 0; }
相关文章推荐
- git 中关于LF 和 CRLF 的问题
- Servlet配置
- 蓝桥杯 ADV-148算法提高 排队打水问题(贪心)
- 交换两个变量的值,不使用第三变量的6种方法
- 深入探索透视纹理映射
- Socket
- Socket
- 蓝桥杯 ALGO-22算法训练 数的划分
- SQLSERVER 启动sa用户登录
- 关键字
- Cpp Primer杂记–extern const的声明注意
- CodeForces 612BHDD is Outdated Technology
- 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)
- 类的构造函数
- sum of two integers
- 蓝桥杯 ALGO-31算法训练 开心的金明(01背包,动态规划)
- 设计模式(十) 装饰模式
- 再谈用strace函数来查看网络发包的目的地ip和port
- 蓝桥杯 ALGO-30算法训练 入学考试(01背包,动态规划)
- iOS多线程开发——NSThread的简单运用