956 最高的廣告牌 動態規劃

2021-10-07 11:54:36 字數 1211 閱讀 3550

題目描述:

你正在安裝乙個廣告牌,並希望它高度最大。這塊廣告牌將有兩個鋼製支架,兩邊各乙個。每個鋼支架的高度必須相等。

你有一堆可以焊接在一起的鋼筋 rods。舉個例子,如果鋼筋的長度為 1、2 和 3,則可以將它們焊接在一起形成長度為 6 的支架。

返回廣告牌的最大可能安裝高度。如果沒法安裝廣告牌,請返回 0。

示例 1:

輸入:[1,2,3,6]

輸出:6

解釋:我們有兩個不相交的子集 和 ,它們具有相同的和 sum = 6。

示例 2:

輸入:[1,2,3,4,5,6]

輸出:10

解釋:我們有兩個不相交的子集 和 ,它們具有相同的和 sum = 10。

示例 3:

輸入:[1,2]

輸出:0

解釋:沒法安裝廣告牌,所以返回 0。

0 <= rods.length <= 20

1 <= rods[i] <= 1000

鋼筋的長度總和最多為 5000

主要思路:動態規劃

(1)動態規劃的陣列 dp[ j ]表示兩個鋼支架高度差為 j 時,此時兩個鋼支架的高度之和為dp[ j ],陣列的大小,既 j 的最大值,為所有鋼筋之和加1;

(2)由於高度差 j 對應的 dp[ j ] 中儲存的是高度和,故需要滿足 j<=dp[ j ];

(3)對於同乙個高度差 j 下,dp[ j ]由於是兩個鋼支架高度之和,則應越大越好,當新增第 i 個鋼筋時,可以新增到兩個鋼支架中的任意乙個之上:

(a)若是新增到較高的支架上,既k= j+rods[ i ] ,則高度差變得更大,儲存到對應的高度差 k 中,既dp[k] = max(dp[k], dptmp[j] + rods[i]);

(b)若是新增到較低的支架上,既 k = abs(j - rods[i]); ,則高度差會變化,可能大,也可能小,不影響,只要儲存到對應的高度差 k中,既 dp[k] = max(dp[k], dptmp[j] + rods[i]);

(4)最後返回高度差為0時,總的高度和除以2,即為單個支架的高度;

class

solution

}return dp[0]

/2;}

};

LeetCode956 最高的廣告牌

題目如果用暴力求解的話會超時,暴力求解也就是每個數字有三種狀態,不被選中 被選中在左邊集合 被選中在右邊集合,然後找左右集合相加和最大的那種情況。時間複雜度3的n次方。題目提示是動態規劃題,那麼最重要的就是定義狀態,差點兒把我愁壞了,然後看了解題報告。題目求廣告牌的最大可能安裝高度,那定義 dp i...

leetcode 956 最高的廣告牌

給出乙個集合,詢問能否挑出兩個不重疊的子集,使得兩個子集內的數字和一樣,求數字和最大是多少。一開始列舉所有集合然後dp一波果斷t了。正解是f i,j 表示前i個數字,組成的兩個集合差為j的時候較大的集合內的數字和,然後列舉一下三種情況dp即可。一開始少算了一種情況,是把第i加在較小的集合裡,仍沒超過...

LeetCode 956 最高的廣告牌(DP)

你正在安裝乙個廣告牌,並希望它高度最大。這塊廣告牌將有兩個鋼製支架,兩邊各乙個。每個鋼支架的高度必須相等。你有一堆可以焊接在一起的鋼筋 rods。舉個例子,如果鋼筋的長度為 1 2 和 3,則可以將它們焊接在一起形成長度為 6 的支架。返回廣告牌的最大可能安裝高度。如果沒法安裝廣告牌,請返回 0。示...