LeetCode956。最高のビルボード(DP)

記事ディレクトリ

1.タイトル

ビルボードを設置していて、最高の高さにしたいと考えています。
この看板には、両側に1つずつ、合計2つのスチールブラケットがあります。各スチールサポートの高さは等しくなければなりません

一緒に溶接できる鋼棒の束があります。
たとえば、棒鋼の長さが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。
 
提示:
0 <= rods.length <= 20
1 <= rods[i] <= 1000
钢筋的长度总和最多为 5000

出典:LeetCode(LeetCode)リンク:https://leetcode-cn.com/problems/tallest-billboard
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

2.問題解決

  • dp[i][j] i棒鋼を処理し、両側のギャップがjのときに形成できる最大の高さを示します
class Solution {
    
    
public:
    int tallestBillboard(vector<int>& rods) {
    
    
        if(rods.size() <= 1)
            return 0;
        int dp[20][5001], n = rods.size();
        int total = accumulate(rods.begin(), rods.end(), 0);
        // dp[i][j] 表示处理完 i 支架,两边差距为 j 时,可以组成的最大高度
        memset(dp, -1, sizeof(dp));
        dp[0][rods[0]] = dp[0][0] = 0;
        for(int i = 1; i < rods.size(); i++) 
        {
    
       //样本维度
            for(int j = 0; j <= total; ++j)
            {
    
    
                if(dp[i-1][j] == -1)//上一行状态不存在
                    continue;
                // 当前钢筋不要,丢弃
                dp[i][j] = max(dp[i][j], dp[i-1][j]);
                // 当前钢筋,加在长的一边
                dp[i][j+rods[i]] = max(dp[i][j+rods[i]], dp[i-1][j]);
                // 当前钢筋,加在短的一边,现在高度差为 abs(j-rods[i])
                dp[i][abs(j-rods[i])] = max(dp[i][abs(j-rods[i])], dp[i-1][j]+min(j, rods[i]));
            }
        }
        // 返回高度差为 0 的情况
        return dp[n-1][0]==-1 ? 0 : dp[n-1][0];
    }
};

40 ms 8.1 MB


私のCSDNブログアドレスhttps://michael.blog.csdn.net/

コードを長押しまたはスキャンして、私の公式アカウント(Michael Amin)をフォローし、一緒に応援し、一緒に学び、進歩してください!
マイケルアミン

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/109004965