給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (w, h) 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。
請計算最多能有多少個信封能組成一組「俄羅斯套娃」信封(即可以把乙個信封放到另乙個信封裡面)。
說明:不允許旋轉信封。
示例:
輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
輸出: 3
解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。
從題目的提問方式,也能很明顯的看出,該問題屬於典型的最值型動態規劃問題。
但是在解決問題的過程中,可能會出現乙個信封a能放入信封b和信封c,但是信封b和信封c互相不能放入。
所以在開始之前我們需要將所有信封按照長度一維進行排序:e0,e1……,en-1
排序之後,如果乙個信封ei是最外層的信封,那麼它的裡面的第一層信封ej一定滿足j最後一步:設最優策略中最後乙個信封即最外層的信封是ei。考慮次外層信封是哪個。這個問題有點像最長遞增子串行的考慮方式。
因此我們可以設f[i]表示以ei為最外層信封時最多的巢狀層數
f[i]表示以ei為最外層信封時最多的巢狀層數
不需要初始條件。
從小到大的順序
時間複雜度o(n*n),空間複雜度o(n )
#這個題目的方法就和最長遞增子串行是一樣的,但是這個題目要求的時間複雜度更為嚴格,需要用貪心演算法
import numpy as np
class
solution
:def
maxenvelopes
(self, envelopes: list[list[
int]])
->
int:
iflen
(envelopes)==0
:return
0 dp =[0
for i in
range
(len
(envelopes))]
envelopes = np.array(envelopes)
envelopes=envelopes[np.lexsort(envelopes[:,
::-1
].t)
] dp[0]
=1max1=
1for i in
range(1
,envelopes.shape[0]
):dp[i]=1
for j in
range
(i):
if envelopes[i][0
]>envelopes[j][0
]and envelopes[i][1
]>envelopes[j][1
]:dp[i]
=max
(dp[i]
,dp[j]+1
) max1=
max(max1,dp[i]
)return max1
俄羅斯套娃信封
給一定數量的信封,帶有整數對 w,h 分別代表信封寬度和高度。乙個信封的寬高均大於另乙個信封時可以放下另乙個信封。求最大的信封巢狀層數。樣例 1 輸入 5,4 6,4 6,7 2,3 輸出 3 解釋 最大的信封巢狀層數是 3 2,3 5,4 6,7 樣例 2 輸入 4,5 4,6 6,7 2,3 1...
俄羅斯套娃信封問題
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...
俄羅斯套娃信封問題
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...