求一个序列的最长不下降子序列的长度,与个数(相同数列算1个)
关键是如何判重。
显然如果之前有一个尾数相同且长度相同的序列,哪么后一个包含前一个所有可能的序列相同的序列,故将前一个序列删除(重复)
Program P1952;
var
n,i,j,ans:longint;
a,len,f,path:array[1..5000] of longint;
begin
read(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do
begin
len[i]:=1;
f[i]:=1;
path[i]:=i;
for j:=i-1 downto 1 do
if (a[j]>a[i]) and (len[j]+1>len[i]) then
begin
len[i]:=len[j]+1;
f[i]:=f[j];
end
else if (a[j]>a[i]) and (len[j]+1=len[i]) then inc(f[i],f[j]);
for j:=1 to i-1 do
if (a[i]=a[j]) and (len[i]=len[j]) then f[j]:=0;
end;
j:=0;
for i:=1 to n do if len[i]>j then j:=len[i];
ans:=0;
for i:=1 to n do if len[i]=j then inc(ans,f[i]);
writeln(j,' ',ans);
end.