单调递增最长子序列
时间限制:
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个字符串要处理
经典的DP,从前向后判断,找出目前的递增长度,因为可能后边的都没有前边的大,所以不一定左后就是最大的!
01.
#include<stdio.h>
02.
#include<string.h>
03.
int
main()
04.
{
05.
int
n;
06.
scanf
(
"%d"
,&n);
07.
getchar
();
08.
while
(n--)
09.
{
10.
int
dp[10001];
11.
char
s[10001];
12.
int
max=1,l,i,j;
13.
gets
(s);
14.
l=
strlen
(s);
15.
for
(i=0;i<l;i++)
16.
dp[i]=1;
17.
for
(i=1; i<l; i++)
18.
for
(j=0; j<i; j++)
19.
if
(s[i]>s[j]&&dp[i]<dp[j]+1)
20.
dp[i]=dp[j]+1;
21.
max=dp[0];
22.
for
(i=0; i<l; i++)
23.
if
(max<dp[i])
24.
max=dp[i];
25.
printf
(
"\n%d\n"
,max);
26.
}
27.
return
0;
28.
}