動態規劃之最長非遞減子串行

2021-10-01 16:04:25 字數 1370 閱讀 5830

在乙個數字序列中,找到乙個最長的非連續子串行,使得這個子串行是不下降(非遞減)。現有序列a=,則a的最長不下降子串行是。

如果有多個最長序列,只需選數字順位靠後的序列從大到小輸出。

輸入2行;

第一行乙個整數n,表示有n個整數的序列要輸入,n<1000;

第二行共有n個整數。

輸出最長的不下降子串行,只需選數字順位靠後的序列從大到小輸出。

731 96 27 -35 46 -96 0

20 -96

如何找到第i個數字到末尾的最長非減序列,關鍵就是找到第i個數字後的數字a[j]

a[j]符合非遞減規則,並且其到末尾距離的非減序列是最長的

這樣第i個數字到末尾的最長非減序列dp[j]+1

數字i從n-2到0,每次問題的求解都需要前面已經求的解,顯然可以使用動態規劃

#include

#include

using

namespace std;

const

int maxn =

1000+10

;int a[maxn]

;// 輸入的序列

int dp[maxn]

;// dp[i]表示第i+1個數到最後乙個數的最長非減序列長度

int index[maxn]

;// 記錄最長非減序列的索引

// index[i]表示序列中索引i的數字的下乙個數字的索引

int n;

intmain()

//找到每個數字到終點的最長非減序長度

for(

int i=n-

2; i>=

0; i--)}

if(length_i)

dp[i]

= length_i +1;

}int max_length =

0, p;

for(

int i =

0; i < n;

++i)

if(dp[i]

>= max_length)

int result[max_length]

;// 儲存最長非減序列

for(

int i=

0; i)sort

(result, result+max_length)

;// 將得到序列從小到大排序

cout << max_length << endl;

for(

int i=max_length-

1; i>=

0; i--

)// 從大到小輸出

cout << endl;

return0;

}

動態規劃之最長非降 公升 子串行

問題描述 在乙個無序的序列a1,a2,am裡,找到乙個最長的序列,滿足ai aj.ak 且i問題分析 如果前i 1個數中的最長非降子串行的最後乙個數是ak 那麼下一步就是在求前k 1個數中的的最長非降子串行 因此我們可以設計乙個狀態opt j 表示前i個數中用到a i 所構成的最優解 核心 那麼決策...

動態規劃之最長回文子串行

15 2 最長回文子串行 回文 palindrome 是正序與逆序相同的非空字串。例如,所有長度為1的字串,civic,racecar,aibohphobia都是回文。設計高效演算法,求給定輸入字串的最長回文子串行。例如,給定輸入character,演算法應該返回carac.演算法的執行時間是怎麼樣...

動態規劃 陣列中最長遞減子串行

求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...