最长子序列
最长子序列
题目描述:
给定两个长度分别为 NN 和 MM 的字符串 AA 和 BB,求既是 AA 的子序列又是 BB 的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数 NN 和 MM。
第二行包含一个长度为 NN 的字符串,表示字符串 AA。
第三行包含一个长度为 MM 的字符串,表示字符串 BB。
字符串均由小写字母构成。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N,M≤10001≤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 }