【題目描述】
設有由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的不下降序列,同時...