求最長不下降序列

2021-08-07 06:30:13 字數 1448 閱讀 3478

【題目描述】

設有由n個不相同的整數組成的數列,記作:b(1),b(2),b(3),…,b(n)且b(i)<>b(j)(i<>j),若存在i1

** **根據動態規劃的原理,由後往前進行搜尋(當然從前往後也不是不行)。

(1)對b(n)來說,由於它是最後乙個數,所以當從b(n)開始查詢時,只存在長度為1的不下降序列。

(2)若從b(n-1)開始,則存在下邊兩種可能性:

(一)若b(n-1)

為演算法上的需求,定義乙個整數型別的二維陣列b[n][3]

(1)b[i][1]表示第i個數的數值本身;

(2)b[i][2]表示從i位置到達n的最長不下降序列長度;

(3)b[i][3]表示從i位置開始最長不下降序列的下乙個位置,若b[i][3]=0則表示後面沒有連線項。

(一)從倒數第二項開始計算,後面僅有1項,比較一次,因63>15,不符合要求,長度仍為一。

(二)從倒數第三項開始其後又兩項,需做兩次比較,得到目前愛唱的不下降學列為2,如下

(一)i+1,i+2,…,n項中,找出比b[i][1]大的最長長度l以及位置k

(二)若l>0,則b[i][2]=l+1;b[i][3]=k;

最後本題經過計算,其資料儲存表如下:

初始化

for(i=1;i<=n;i++)

下面給出求最長不下降序列的演算法

for(i=n-1;i>=1;i--)

if(l>0)

}

下面找出最長不下降序列:

k=1;

for(j=1;j<=n;j++)

if(b[j][2]>

b[k][2]) k=j;

最長不下降序列長度為b[k][2]序列:

while(k!=0)

#include

using

namespace

std;

int main()

for(i=n-1;i>=1;i--)

if(l>0)

}k=1;

for(j=1;j<=n;j++)

if(b[j][2]>b[k][2]) k=j;

cout

<

<2]

}

求最長不下降序列

求最長不下降序列 time limit 1000ms memory limit 65536k total submit 398 accepted 171 description 設有n n 1000 個不相同的整數 小於32767 組成的數列,記為 a1,a2,an,其中任意兩個數不相同。例如 3,...

求最長不下降序列

求最長不下降序列 time limit 1000ms memory limit 65536k total submit 402 accepted 174 description 設有n n 1000 個不相同的整數 小於32767 組成的數列,記為 a1,a2,an,其中任意兩個數不相同。例如 3,...

求最長不下降序列(逆推)

description 設有n n 1000 個不相同的整數 小於32767 組成的數列,記為 a1,a2,an,其中任意兩個數不相同。例如 3,18,7,14,10,12,23,41,16,24。若有 且有 則稱為長度為e的不下降序列。如上例中,3,18,23,24為乙個長度為4的不下降序列,同時...