单调递增最长子序列

View Code
 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #define Max 10010
5 #define max(a,b) (((a) > (b)) ? (a) : (b))
6 using namespace std;
7 char ch[Max];
8 int d[Max];
9 int dp(int i)
10 {
11 int k,ans=1;
12 if(d[i]!=-1)
13 return d[i];
14 for(k=i-1;k>=0;k--)
15 {
16 if(ch[i]>ch[k])
17 {
18 d[k]=dp(k);
19 ans=max(ans,d[k]+1);
20 }
21 }
22 return d[k]=ans;
23 }
24 int main()
25 {
26 int n,len,ans,i;
27 scanf("%d",&n);
28 while(n--)
29 {
30 ans=0;
31 scanf("%s",ch);
32 len=strlen(ch);
33 memset(d,-1,sizeof(d));
34 for(i=0;i<len;i++)
35 {
36 ans=max(ans,dp(i));
37 }
38 printf("%d\n",ans);
39 }
40 return 0;
41 }

描述求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4

 
输入
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000
输出
输出字符串的最长递增子序列的长度
样例输入
3
aaa
ababc
abklmncdefg
样例输出
1
3
7
posted @ 2012-02-26 11:28  qijinbiao1  阅读(194)  评论(0编辑  收藏  举报