堆磚塊

網(wǎng)易居然掛了我。。所以做一題網(wǎng)易的。。
https://www.nowcoder.com/question/next?pid=4575457&qid=83062&tid=7760015
dp+滾動數(shù)組+狀態(tài)壓縮
50w的數(shù)據(jù)讓我們無法使用二維狀態(tài) 50*50w也會報內(nèi)存溢出
dp[i][j] i代表狀態(tài)前置和后置狀態(tài) j代表兩個塔的插值
我們把左邊塔當(dāng)作第一目標(biāo)
所以j+height[i]當(dāng)作往左邊塔放入磚塊
j-height當(dāng)作右邊塔放入磚塊 右邊塔放入時高度也會增加
如果不放入就用前置狀態(tài)
三個求最大值
代碼如下

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int dp[2][2*N]; //第一維滾動狀態(tài) 第二維兩個塔的差值
int height[55];
int main()
{
    int n;
    cout << 1e5;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &height[i]);
    }
    memset(dp, 0, sizeof(dp));
    int p = 0;

    for (int j = 0; j < 2*N; j++) dp[1-p][j] = INT_MIN; //保證第一次取不到
    dp[1-p][N] = 0;//入口
    for (int i = 1; i <= n; i++)
    {
        for (int j = height[i]; j < 2*N; j++)
        {
            dp[p][j] = max(dp[1-p][j-height[i]]+height[i], dp[1-p][j]); //放到右邊減小差距并增加塔高 以及不放入磚塊
        }
        for (int j = 0; j+height[i] < 2*N; j++)
        {
            dp[p][j] = max(dp[p][j], dp[1-p][j+height[i]]); //放到左邊增加差距
        }
        p = 1 - p;
    }
    if (dp[1-p][N]) cout << dp[1-p][N] << endl;
    else cout <<-1;
    return 0;
}

現(xiàn)在的我是真的弱。。下周面網(wǎng)易游戲、頭條、美團(tuán)。。good luck and fighting

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問題描述 小易有n塊磚塊,每一塊磚塊有一個高度。小易希望利用這些磚塊堆砌兩座相同高度的塔。為了讓問題簡單,磚塊堆砌...
    RobotBerry閱讀 920評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,890評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,627評論 18 399
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,990評論 0 89
  • 貪心算法 貪心算法總是作出在當(dāng)前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,420評論 3 52

友情鏈接更多精彩內(nèi)容