最长共同子序列 --- DP(动态规划)
来源:互联网 发布:网络装备交易排行榜 编辑:程序博客网 时间:2024/05/29 07:46
题目,就是首先输入两个串的长度,
接着输入两个串
n = 4
m = 4
s = "abcd"
t = "bcde"
输出:
3 (“bcd”)
就是公共的最长子序列。
解题分析:
对于这种题目,首先要推倒转移方程,那么这里可以先定义二维数组dp[ i ] [ j ]
然后根据串 s 和 t 的长度 i , j来定义方程
s1....si 与 T1,,....Tj 的共同子序列是dp[ i ] [ j ]
这样一来, S1.....Si 与 t1 ... tj的共同子序列之后加上Si + 1,
s1 .... si 与 t1 ...t j + 1的共同子序列,
和 s1....S i +1 与 t1.....t j 的共同子序列的其中之一因此下面公式成立。
dp[i + 1][ j + 1] =
{
max(dp[ i ] [ j ] + 1, dp[ i ] [j + 1], dp[ i + 1 ][ j ])
max( dp[ i ] [ j + 1] + dp [ i + 1] [ j ] ) (除此之外)
}
这个运算的时间复杂度是: O(n * m)
代码如下:
<strong><span style="font-size:18px;">#include <iostream>#include <cstdio>#define MAXN 1000using namespace std;int n, m;char s[MAXN], t[MAXN];int dp[MAXN][MAXN];int main(){cin>>n>>m;for(int i = 0; i < n; i++){cin >> s[i];}for(int i = 0; i < m; i++){cin >> t[i];}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(s[i] == t[j]){dp[i + 1][j + 1] = dp[i][j] + 1;}else{dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);}}}cout<<dp[n][m]<<endl;return 0;}</span></strong>
0 0
- 最长共同子序列 --- DP(动态规划)
- 最长共同子序列(LCS)的动态规划算法
- 最长共同子序列LCS—动态规划实现
- 最长公共子序列-动态规划DP
- 最长上升子序列 动态规划 dp
- LCS(最长公共子序列)和dp(动态规划)
- 动态规划(DP)之最长上升子序列
- DP 动态规划 Problem A 1001 最长子序列
- NYOJ - 36 - 最长公共子序列(LCS,动态规划DP)
- 最长上升子序列问题-动态规划(DP)
- 动态规划(DP)之最长上升子序列问题
- codevs1576 最长严格上升子序列 动态规划dp
- 最长递增子序列-动态规划dp-51node
- 最长公共子序列(dp动态规划)
- 动态规划----最长子序列
- 【最长子序列 动态规划】
- 动态规划----最长子序列
- 最长子序列--动态规划
- x-requested-with
- iOS编程规范
- windows下为vim配置Taglist、Ctags
- iOS媒体视频播放器应用源码
- Hibernate一对多关联映射
- 最长共同子序列 --- DP(动态规划)
- Count and Say @python 题解
- Java中创建(实例化)对象的五种方式
- 解析XML文件的几种方式及其比较
- suse11如何配置rsh
- [boost][2015-04-23] boost linux下的安装 编译 使用
- decorators.xml学习
- 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
- 并查集+最小生成树_HDU_1102