求乙個序列的最長不下降子串行的長度,與個數(相同數列算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];
endelse 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.
POJ 1952(最長不下降子串行的個數)
求乙個序列的最長不下降子串行的長度,與個數 相同數列算1個 關鍵是如何判重。顯然如果之前有乙個尾數相同且長度相同的序列,哪麼後乙個包含前乙個所有可能的序列相同的序列,故將前乙個序列刪除 重複 program p1952 var n,i,j,ans longint a,len,f,path array...
POJ 1952 最長下降子串行 方案數
求最長下降子串行 簡單 就是求方案數比較麻煩點 看了別人的解題報考才懂 也對最長 子串行的理解更深一步 include include includeusing namespace std const int maxn 5005 int n int price maxn len maxn count...
最長不下降子串行
a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...