目录

0956:最高的广告牌(2381 分)

力扣第 114 场周赛第 4 题

题目

你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。

你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋的长度为 123,则可以将它们焊接在一起形成长度为 6 的支架。

返回 广告牌的最大可能安装高度 。如果没法安装广告牌,请返回 0

示例 1:

输入:[1,2,3,6]
输出:6
解释:我们有两个不相交的子集 {1,2,3} 和 {6},它们具有相同的和 sum = 6。

示例 2:

输入:[1,2,3,4,5,6]
输出:10
解释:我们有两个不相交的子集 {2,3,5} 和 {4,6},它们具有相同的和 sum = 10。

示例 3:

输入:[1,2]
输出:0
解释:没法安装广告牌,所以返回 0。

提示:

  1. 0 <= rods.length <= 20
  2. 1 <= rods[i] <= 1000
  3. sum(rods[i]) <= 5000

相似问题:

分析

  • 考虑最后一个钢筋 x=rods[-1] 选不选
    • 选的话,需要求前面拼出两个支架相差 x 时的最大高度
  • 因此,维护 d[diff]=w 代表当前两个支架相差 diff 时,高度之和最大为 w,即可递推

解答

1
2
3
4
5
6
7
8
9
class Solution:
    def tallestBillboard(self, rods: List[int]) -> int:
        d = defaultdict(int)
        d[0] = 0
        for x in rods:
            for diff,w in list(d.items()):
                d[diff+x] = max(d[diff+x],w+x)
                d[abs(diff-x)] = max(d[abs(diff-x)],w+x)
        return d[0]//2

319 ms