求最長不下降序列(動態規劃)

2021-07-11 01:59:02 字數 1769 閱讀 9044

description

設有n(n<=1000)個不相同的整數(小於32767)組成的數列,記為: 

a1,a2,...,an,其中任意兩個數不相同。 

例如:3,18,7,14,10,12,23,41,16,24。 

若有 且有 。則稱為長度為e的不下降序列。如上例中,3,18,23,24為乙個長度為4的不下降序列,同時也有3,7,10,12,16,24長度為6的不下降序列。程式要求,當原始數列給出後,求出最長的不下降數列的長度。 

input

output

sample input

10 

3 18 7 14 10 12 23 41 16 24

sample output

6

解題思路1:f[i]記錄從末端到第i個數的不下降序列長度,狀態轉移方程為:
f[i]=max

1<=ia[i]

max為所求。

程式1:

vara,f,p:array[1..1000]of longint;

i,j,k,l,n:longint;

begin

readln(n);

for i:=1 to n do

begin

read(a[i]);

f[i]:=1;

p[i]:=0;

end;

for i:=n-1 downto 1 do

begin

l:=0;

k:=0;

for j:=i+1 to n do

if (a[j]>a[i]) and (f[j]>l) then begin l:=f[j]; k:=j; end;

if l>0 then begin f[i]:=l+1; p[i]:=k; end;

end;

k:=1;

for i:=1 to n do

if f[i]>k then k:=f[i];

writeln(k);

end.

解題思路2:

f[i]記錄從末端到第i個數的不下降序列長度,狀態轉移方程為:

f[i]=max 2<=i<=j<=i-1 

a[j]

max為所求。

程式2:

vara,f,p:array[1..1000]of longint;

i,j,k,l,n:longint;

begin

readln(n);

for i:=1 to n do

begin

read(a[i]);

f[i]:=1;

p[i]:=0;

end;

for i:=2 to n do

begin

l:=0;

k:=0;

for j:=i-1 downto 1 do

if (a[j]

l) then begin l:=f[j]; k:=j; end;

if l>0 then begin f[i]:=l+1; p[i]:=k; end;

end;

k:=1;

for i:=1 to n do

if f[i]>k then k:=f[i];

writeln(k);

end.

版權屬於: chris

最長不下降子串行 動態規劃

一。問題描述 給定乙個序列a1 a2 a3 an現要求你從中找到最長的不下降子串行 二。問題分析 該問題可以和之前的max sum問題模擬,如果從決策的角度入手,直接引入並定義狀態f i 為 a i 所在子串行到i的長度 那我們的決策策略應該就是使得 f i 最大 所以基於這個分析我們很容易列出動態...

動態規劃 最長不下降序列

題目 乙個正整數序列b1,b2,bn,若下標為i1解析 這道題也是動態規劃的題目 和以前發布的那道 萬達廣場 有一些相似 這道題的精髓 就在於從第2個到第n個 都要選擇前面符合條件的數字中最大的乙個 再 1這道題 非常簡單 沒啥麼好說的 下面是 include include include inc...

動態規劃 最長不下降子串行

參考 每一次從頭掃瞄找出最佳答案。int a maxn d maxn intdp return ans 參考了這篇文章 那麼 如下 for int i 0 i n i scanf d a i memset dp,0x1f sizeof dp mx dp 0 for int i 0 i n i ans...