413,動態規劃求最長上公升子串行

2022-09-18 09:51:15 字數 1512 閱讀 1141

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:

輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

動態規劃我們用dp[i]表示陣列的前i個元素構成的最長上公升子串行,如果要求dp[i],我們需要用num[i]和前面的數字乙個個比較,如果比前面的任何乙個數字大,說明加入到他的後面可以構成乙個上公升子串行 ,就更新dp[i]。我們就以[8,2,3,1,4]為例來畫個圖看一下

我們再來看下**

public

intlengthoflis

(int

nums)

int[

] dp =

newint

[nums.length]

;//初始化陣列dp的每個值為1

arrays.

fill

(dp,1)

;int max =1;

for(

int i =

1; i < nums.length; i++)}

}return max;

}

上公升子串行加入到集合中這題還有一種解決方式就是把找到的上公升子串行放到乙個集合list中,我們每次遍歷的時候都會拿當前值nums[i]和list的最後乙個元素比較

1,如果nums[i]比list最後乙個元素大,說明nums[i]加入到list的末尾可以構成乙個更長的上公升子串行,我們就把nums[i]加入到list的末尾。

2,如果nums[i]不大於list的最後乙個元素,說明nums[i]和list不能構成乙個更長的上公升子串行,但我們可以用nums[i]把list中第乙個大於他的給替換掉。我們要保證list中元素不變的情況下,值越小越好,這樣當我們加入乙個新值的時候,構成上公升子串行的可能性就越大。

再來看下**

public

intlengthoflis

(int

nums)

}return list.

size()

;}

總結這題也是比較常見的一道題,動態規劃應該說是最好理解的。如果完全搞懂的話,下面的那種解法其實也是比較經典的。

動態規劃 最長上公升子串行

問題描述 乙個數的序列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 等等...

動態規劃 最長上公升子串行

動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...

動態規劃 最長上公升子串行

總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它...