在乙個數字序列中,找到乙個最長的非連續子串行,使得這個子串行是不下降(非遞減)。現有序列a=,則a的最長不下降子串行是。
如果有多個最長序列,只需選數字順位靠後的序列從大到小輸出。
輸入2行;
第一行乙個整數n,表示有n個整數的序列要輸入,n<1000;
第二行共有n個整數。
輸出要求
輸出最長的不下降子串行,只需選數字順位靠後的序列從大到小輸出。
731 96 27 -35 46 -96 0
20 -96
思路:設定乙個a陣列儲存原始的資料
設定乙個dp陣列,從最後乙個資料開始,記錄下以其為首的最長非遞減子串行的長度
設定乙個索引陣列index,記錄當前元素的下一跳元素
result陣列記錄最終的結果
從倒數第二個開始向前進行推進來更新dp,更新後的dp又會被更前面的用到,全部更新完畢之後,從中選取乙個最大的值作為最長非遞減子串行的長度
同時index會儲存每個元素的下一跳的位置,保證元素可以被找到,找到之後,將元素存入result陣列中,進行排序,按從大到小輸出
具體實現的**如下:
#include
#include
using
namespace std;
#define n 1000
//記錄當前的最長的非連續子串行的長度
int dp[n]
;//儲存資料的陣列
int a[n]
;//儲存當前位置元素的下一跳位置
int index[n]
;//儲存最終結果
int result[n]
;int
main()
//初始化dp陣列,設定資料都為1(自身就是1)
//初始化index陣列
for(i =
1; i <= n; i++
)//從倒數第2個開始(倒數第乙個不用記錄),記錄以其為首到後面的最長非遞減子串行的長度
for(i = n -
1; i >=
1; i--)}
//如果子串行不為0(即後面存在非遞減子串行),則對其更新,等於後面非遞減子串行的長度加1
if(sub_sequence_length)
}//找到dp陣列中最大的那乙個數,其對應的就是最長非遞減子串行的第乙個元素
int max_length =
0, p;
for(i =
1; i <= n; i++)}
for(i =
1; i <= max_length; i++
)//進行排序
//我們第乙個位置沒有用,所以首元素位址是result + 1
sort
(result +
1, result + max_length +1)
; cout << max_length << endl;
for(i = max_length; i >=
1; i--
)else
cout << result[i]
<<
" ";
} cout << endl;
return0;
}
動態規劃 最長非降子串行
先分享一篇文章 動態規劃 從新手到專家 作者正是通過這篇文章來學習的。文中對動態規劃的設計思想做了非常詳細的介紹,並通過簡單問題和複雜問題對動態規劃的設計流程進行剖析,以下是作者和出處 先介紹下問題,給定長度為n的整數序列 a 1 a 2 a n 求得其中最長非降子串行的長度,即lis longes...
動態規劃 最長非降子串行
乙個序列有n個數 a 1 a 2 a n 求出最長非降子串行的長度。講dp基本都會講到的乙個問題lis longest increasing subsequence 正如上面我們講的,面對這樣乙個問題,我們首先要定義乙個 狀態 來代表它的子問題,並且找到它的解。注意,大部分情況下,某個狀態只與它前面...
動態規劃之最長連續公共子串行
include include include using namespace std 最長連續公共子串行 int maxlength const char str1,const char str2,int str1 len,int str2 len c i j 表示以str1 i 1 和str2 ...