最长共同子序列 --- 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
原创粉丝点击