内容目录
求一个序列的最长不下降子序列的长度,与个数(相同数列算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.