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)をフォローし、一緒に応援し、一緒に学び、進歩してください!