nyoj 17 資料結構 最長單調遞增子序列
阿新 • • 發佈:2019-02-19
單調遞增最長子序列
時間限制:3000 ms | 記憶體限制:65535 KB 難度:4- 描述
- 求一個字串的最長遞增子序列的長度
如:dabdbf最長遞增子序列就是abdf,長度為4- 輸入
- 第一行一個整數0<n<20,表示有n個字串要處理
隨後的n行,每行有一個字串,該字串的長度不會超過10000 - 輸出
- 輸出字串的最長遞增子序列的長度
- 樣例輸入
-
3 aaa ababc abklmncdefg
- 樣例輸出
-
1 3 7
經典的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.
}