最长子序列

最长子序列

 

题目描述:

给定两个长度分别为 NN 和 MM 的字符串 AA 和 BB,求既是 AA 的子序列又是 BB 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 NN 和 MM。

第二行包含一个长度为 NN 的字符串,表示字符串 AA。

第三行包含一个长度为 MM 的字符串,表示字符串 BB。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1N,M10001≤N,M≤1000

输入样例:

4 5
acbd
abedc

输出样例:

3

 

(动态规划) O(n2)O(n2)
状态表示:f[i]表示从第一个数字开始算,以w[i]结尾的最大的上升序列。(以w[i]结尾的所有上升序列中属性为最大值的那一个)

状态计算(集合划分):j∈(0,1,2,..,i-1), 在w[i] > w[j]时,
f[i] = max(f[i], f[j] + 1)。
有一个边界,若前面没有比i小的,f[i]为1(自己为结尾)。

最后在找f[i]的最大值。

时间复杂度
O(n2)O(n2) 状态数(nn) * 转移数(nn)

 

 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = 1010;
 5 int w[N];
 6 int f[N];
 7 int n;
 8 
 9 int main()
10 {
11     cin >> n;
12     for(int i = 0 ; i< n ; i ++ ) cin >> w[i];
13     
14     int mx = 1;
15     for(int i = 0 ; i < n ;i ++)
16     {
17         f[i] = 1;
18         for(int j = 0;j < i; j++)
19         {
20             if(w[i] > w[j] )  f[i] = max(f[i], f[j] + 1);
21         }
22         mx = max( f[i] , mx);
23         
24     }
25     cout << mx << endl;
26     return 0;
27 }

 

posted @ 2021-04-08 10:28  Leo-aiolia-bao  阅读(249)  评论(0编辑  收藏  举报