单调递增最长子序列
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 - 输出
- 输出字符串的最长递增子序列的长度
- 样例输入
-
3 aaa ababc abklmncdefg
- 样例输出
-
1 3 7
- 来源
- 经典题目
-
上传者
dp[i]表示前i个字符串时候最长递增子序列长度。则取局部最优,动态规划
#include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #include <iostream> #include <string> using namespace std; #define mem(a) memset(a, 0, sizeof(a)) char a[10100]; int dp[10100]; int main() { int n; cin >> n; while (n --) { mem(a); mem(dp); cin >> a; int ans = 1, p = strlen(a); //for (int i = 0; i<p; i++) dp[i] = 1; dp[0] = 1; for (int i = 1; i<p; i++) { int Max = 0; for (int j = i-1; j>=0; j--) { if (a[i] > a[j] && Max < dp[j]) Max = dp[j]; } dp[i] = Max + 1; if (dp[i] > ans) ans = dp[i]; } cout << ans << endl; } return 0; }