单调递增最长子序列
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4-
输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
- 输出字符串的最长递增子序列的长度 样例输入
-
3 aaa ababc abklmncdefg
样例输出
-
1 3 7
来源
单点递增最长子序列问题:
定义dp[i]表示以ai为结尾的最长递增子序列长度
故有dp[i+1]=dp[i](只包含ai的上升子序列)
满足j<i && a[j]<a[i] 的以ai为结尾的序列为长度为a[j]+1
#include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> #include<cstdio> #define MAX 10005 using namespace std; int main(){ int n; scanf("%d", &n); //cin >> n; while (n--){ char str[MAX]; scanf("%s", str); //cin >> str; int len = strlen(str); int dp[MAX] = { 0 }; int Max = 0; for (int i = 0; i<len; i++){ dp[i] = 1; for (int j = 0; j<i; j++){ if (str[j]<str[i]) dp[i] = max(dp[i], dp[j]+ 1); } Max = max(Max, dp[i]); } printf("%d\n", Max); // cout << Max << endl; } }
-
第一行一个整数0<n<20,表示有n个字符串要处理