956. 最高的广告牌

2024/03/25 leetcode 共 765 字,约 3 分钟

title

problem link

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

你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋的长度为 1、2 和 3,则可以将它们焊接在一起形成长度为 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

solution

参考

f(i,c) 表示前i个差值为c时的两棍之和的最大值

难点在于表示状态,f(i,c)表示两棍最小的那个值也可以。 主要把差值作为状态。

class Solution:
    def tallestBillboard(self, rods: List[int]) -> int:
        @functools.lru_cache(None)
        def f(i, c):
            # 前i个差值为c时的两棍之和的最大值
            if i == 0:
                # return 0
                return 0 if c == 0 else float('-inf')
            v = rods[i - 1]
            # not select
            res = f(i - 1, c)
            # select
            res = max(res, f(i - 1, abs(c - v)) + v, f(i - 1, c + v) + v)
            # print(i, c, res)
            return res

        n = len(rods)
        ans = f(n, 0) // 2
        return ans


Search

    Table of Contents