乙個序列有n個數:a[1],a[2],…,a[n],求出最長非降子串行的長度。 (講dp基本都會講到的乙個問題lis:longest increasing subsequence)
正如上面我們講的,面對這樣乙個問題,我們首先要定義乙個「狀態」來代表它的子問題, 並且找到它的解。注意,大部分情況下,某個狀態只與它前面出現的狀態有關, 而獨立於後面的狀態。
讓我們沿用「入門」一節裡那道簡單題的思路來一步步找到「狀態」和「狀態轉移方程」。 假如我們考慮求a[1],a[2],…,a[i]的最長非降子串行的長度,其中i為了方便理解我們是如何找到狀態轉移方程的,我先把下面的例子提到前面來講。 如果我們要求的這n個數的序列是:
5,3,4,8,6,7
根據上面找到的狀態,我們可以得到:(下文的最長非降子串行都用lis表示)
ok,分析到這,我覺得狀態轉移方程已經很明顯了,如果我們已經求出了d(1)到d(i-1), 那麼d(i)可以用下面的狀態轉移方程得到:
d(i) = max,其中j用大白話解釋就是,想要求d(i),就把i前面的各個子串行中, 最後乙個數不大於a[i]的序列長度加1,然後取出最大的長度即為d(i)。 當然了,有可能i前面的各個子串行中最後乙個數都大於a[i],那麼d(i)=1, 即它自身成為乙個長度為1的子串行。public class lis ;
system.out.print(liss(num));
} public static int liss(int num)
return len; }
}
動態規劃 最長非降子串行
先分享一篇文章 動態規劃 從新手到專家 作者正是通過這篇文章來學習的。文中對動態規劃的設計思想做了非常詳細的介紹,並通過簡單問題和複雜問題對動態規劃的設計流程進行剖析,以下是作者和出處 先介紹下問題,給定長度為n的整數序列 a 1 a 2 a n 求得其中最長非降子串行的長度,即lis longes...
動態規劃之最長非降 公升 子串行
問題描述 在乙個無序的序列a1,a2,am裡,找到乙個最長的序列,滿足ai aj.ak 且i問題分析 如果前i 1個數中的最長非降子串行的最後乙個數是ak 那麼下一步就是在求前k 1個數中的的最長非降子串行 因此我們可以設計乙個狀態opt j 表示前i個數中用到a i 所構成的最優解 核心 那麼決策...
動態規劃之最長非遞減子串行
在乙個數字序列中,找到乙個最長的非連續子串行,使得這個子串行是不下降 非遞減 現有序列a 則a的最長不下降子串行是。如果有多個最長序列,只需選數字順位靠後的序列從大到小輸出。輸入2行 第一行乙個整數n,表示有n個整數的序列要輸入,n 1000 第二行共有n個整數。輸出最長的不下降子串行,只需選數字順...