单调递增最长子序列
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 - 输出字符串的最长递增子序列的长度 样例输入
3 aaa ababc abklmncdefg
样例输出1 3 7
思路:
动态规划的思想,把原问题分拆成若干相对简单的子问题,然后将其记忆化存储,以便下次需要同一个子问题解决的时候直接查表。针对这一题,假如要求的字符串长度为l,就先求出前1,2,3,4,. . . 个字符串的解,把他们结果存储在dp数组里面,以便后面用到的时候直接查表,当程序运行到第l个时,问题也就解决了。
代码:
Java Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> #include<bits/stdc++.h> using namespace std; int main() { int n; int dp[10005]; char a[10005]; scanf("%d",&n); while(n--) { scanf("%s",a); int l=strlen(a); int MAX=-1; for(int i=0;i<l;i++) { ///求出前i个字符的结果 dp[i]=1; for(int j=0;j<i;j++) { ///查表计算 if(a[j]<a[i]&&dp[i]<dp[j]+1) { dp[i]=dp[j]+1; } } } for(int i=0;i<l;i++) { if(dp[i]>MAX) { MAX=dp[i]; } } printf("%d\n",MAX); } return 0; } |