有乙個長為n的數列a0,a1,...,a(n-1)。請求出這個序列中最長的上公升子串行的長度。上公升子串行指的是對於任意的i限制條件:1<=n<=1000, 0<=ai<=1000000最長上公升子串行(lis,longest increasing subsequence)這是個經典的問題,也代表了乙個型別的題目。尋找lis,很容易想到使用動態規劃,那麼如何使用呢?樣例輸入:n=5 a=
輸出:3(a1,a2,a4構成的子串行)
首先定義乙個一維陣列dp[n]來用於記錄對應位置的lis,然後尋找該問題的邊界,即可分解的最小的狀態。因為就單個數字而言,其可以被看為是乙個長度為1的序列,所以邊界應該是dp[0]=1。
接著來尋找狀態轉移方程。對乙個位置的dp[i]而言,從序列開始到該位置的lis的長度有兩種可能,分別是1(aiaj,其中0<=j
#include#includeusing namespace std;
int main()
max=max(max,dp[i]);
} cout<
return 0;
}
最長上公升子串行(LIS)問題
問題描述 給定乙個序列 a1,a2,an 求它的乙個子串行 ak1,ak2,aki 不一定連續 使得該子串行滿足ak1 ak2 akn且長度最長,如序列 1,7,3,5,9,4,8 的乙個lis是 1,3,5,8 遞迴表示式 作如下定義 由以上定義可得如下遞迴表示式 則原問題最優解為max int ...
最長上公升子串行LIS問題
問題描述犯懶 手動抱拳 優化前 優化是第二層迴圈用二分搜尋遍歷,自己不理解所以嘗試了一下優化前,可以直接看優化後 dp i 長度為i 1的上公升子串行末尾元素的最小值 不斷更新,dp陣列中最後存的不一定是得到的最長上公升子串行,比如說原來存的是,但是在遇到1之後dp會更新 include inclu...
最長上公升子串行 LIS
題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...