单调递增最长子序列
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4-
输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
- 输出字符串的最长递增子序列的长度 样例输入
-
3 aaa ababc abklmncdefg
样例输出
-
1 3 7
-
第一行一个整数0<n<20,表示有n个字符串要处理
思路分析:LIS最长不下降子序列,这里把=去掉,因为题目中要求的是递增的,等于也不行。经典的DP问题
#include <iostream>
#include <string>
#define MAX 10000 + 10
using namespace std;
int dp[MAX];
int main() {
string str;
int n;
cin >> n;
while( n-- ) {
fill( dp, dp + MAX, 0 );
cin >> str;
int ans = -1;
for( int i = 0; i < str.size(); i++ ) {
dp[i] = 1;
for( int j = 0; j < i; j++ ) {
if( str[i] > str[j] && ( dp[j] + 1 > dp[i] ) ) {
dp[i] = dp[j] + 1;
}
}
ans = max( ans, dp[i] );
}
cout << ans << endl;
}
return 0;
}