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...