問題描述:在乙個無序的序列a1,a2,.....,am裡,找到乙個最長的序列,滿足ai<=aj...<=ak; 且i問題分析:如果前i-1個數中的最長非降子串行的最後乙個數是ak;那麼下一步就是在求前k-1個數中的的最長非降子串行;
因此我們可以設計乙個狀態opt[j]表示前i個數中用到a[i]所構成的最優解(核心)。
那麼決策就是在前i-1個數中找到最大的opt[j] 使得a[j]<=a[i],那麼opt[j]+1 就是opt[i]的值;
方程可以這樣表示:
下面是一c測試**:
#include #include int main()
; int opt[10], i, j, max = 0;
for(i=0; i<10; i++)
opt[i] = 0;
opt[0] = 1; //只有乙個數時最長非降序列長度為1
for(i=1; i<10; i++)}}
for(i=0; i<10; i++)
if(opt[i] > max)
max = opt[i];
printf("max:%d\n", max);
return 0;
}
動態規劃 最長非降子串行
先分享一篇文章 動態規劃 從新手到專家 作者正是通過這篇文章來學習的。文中對動態規劃的設計思想做了非常詳細的介紹,並通過簡單問題和複雜問題對動態規劃的設計流程進行剖析,以下是作者和出處 先介紹下問題,給定長度為n的整數序列 a 1 a 2 a n 求得其中最長非降子串行的長度,即lis longes...
動態規劃 最長非降子串行
乙個序列有n個數 a 1 a 2 a n 求出最長非降子串行的長度。講dp基本都會講到的乙個問題lis longest increasing subsequence 正如上面我們講的,面對這樣乙個問題,我們首先要定義乙個 狀態 來代表它的子問題,並且找到它的解。注意,大部分情況下,某個狀態只與它前面...
動態規劃之最長非遞減子串行
在乙個數字序列中,找到乙個最長的非連續子串行,使得這個子串行是不下降 非遞減 現有序列a 則a的最長不下降子串行是。如果有多個最長序列,只需選數字順位靠後的序列從大到小輸出。輸入2行 第一行乙個整數n,表示有n個整數的序列要輸入,n 1000 第二行共有n個整數。輸出最長的不下降子串行,只需選數字順...