在乙個數字序列中,找到乙個最長的非連續子串行,使得這個子串行是不下降(非遞減)。現有序列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...