POJ 1952(最長不下降子串行的個數)

2021-09-30 15:31:56 字數 877 閱讀 8031

求乙個序列的最長不下降子串行的長度,與個數(相同數列算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...