leetcode題解 最長上公升子串行問題

2021-09-11 12:06:32 字數 1351 閱讀 5610

lis(longest increasing subsequence)最長上公升子串行 乙個數的序列bi,當b1 < b2 < … < bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列(a1, a2, …, an),我們可以得到一些上公升的子串行(ai1, ai2, …, aik),這裡1 <= i1 < i2 < … < ik <= n。 比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上公升子串行,如(1, 7), (3, 4, 8)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8). 你的任務,就是對於給定的序列,求出最長上公升子串行的長度。

暴力解法

動態規劃解法

狀態定義

lis(i)表示以第i個數字為結尾的最長上公升子串行的長度。

lis(i)表示[0…i]的範圍內,選擇數字nums[i]可以獲得的最長上公升子串行的長度。

狀態轉移
lis(i) = max(1+lis(j) if nums[i]>nums[j]) (j複製**
**實現

遞迴加記憶化搜尋

class

solution

if (memo[index] != -1)

int res = 1;

for (int i = 0; i < index; i++)

}memo[index] = res;

return res;

}public:

intlengthoflis

(vector

& nums)

memo = vector

(n, -1);

int res = -1;

for(int i = 0; i < n; i++)

return res;

}};複製**

使用動態規劃
class

solution

//memo[index]表示在[0…index]的範圍內,選擇數字nums[index]可以獲得的最長上公升子串行的長度。

vector

memo(n, 1);

for (int i = 1; i < n; i++)}}

int res = -1;

for(int i = 0; i < n; i++)

return res;

}};複製**

-------------------------華麗的分割線--------------------

看完的朋友可以點個喜歡/關注,您的支援是對我最大的鼓勵。

個人部落格番茄技術小棧和掘金主頁

Dp 最長上公升子串 最長上公升子串行

乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...

Leetcode最長上公升子串行LIS

理論 動態規劃初步 最長上公升子串行 lis 模板 void slove int first lower bound dp,dp n,inf dp printf d n dp first 1 printf d n first 題解 相當於求最長公共子串行,但是普通的演算法需要o n m 這道題目ta...

最長上公升子串行 變異版 題解

最長上公升子串行 lis.pas c cpp lis 問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。例如 對於長度為6的序列 2,7,3,4,8,5 它的最長上公升子串行為 2,3,...