序列型動態規劃 俄羅斯套娃信封問題

2021-10-18 23:21:26 字數 1642 閱讀 4953

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (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...