nyoj 17データ構造は最長で、単調にサブシーケンスをインクリメントします.
2033 ワード
最長男シーケンスを単調にインクリメント
時間制限:
3000 ms | メモリ制限:
65535 KB
難易度:
4
説明
文字列の最大増分のサブシーケンスの長さを求めます.
例えば、dabdbfの一番長いインクリメントサブシーケンスはabdfで、長さは4です.
入力
最初の行の整数0その後のn行には、各行に1つの文字列があります.この文字列の長さは10000を超えません.
出力
出力文字列の最大値は、サブシーケンスの長さを増加させます.
サンプル入力
古典的なDPは、前から後ろに判断して、現在の増分長さを探し出します.後ろにあるのは前の大きさがないかもしれませんので、左の後が一番大きいとは限りません.
時間制限:
3000 ms | メモリ制限:
65535 KB
難易度:
4
説明
文字列の最大増分のサブシーケンスの長さを求めます.
例えば、dabdbfの一番長いインクリメントサブシーケンスはabdfで、長さは4です.
入力
最初の行の整数0
出力
出力文字列の最大値は、サブシーケンスの長さを増加させます.
サンプル入力
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
(
"
%d
"
・,max);
26.
}
27.
return
0;
28.
}