堆砖块

网易居然挂了我。。所以做一题网易的。。
https://www.nowcoder.com/question/next?pid=4575457&qid=83062&tid=7760015
dp+滚动数组+状态压缩
50w的数据让我们无法使用二维状态 50*50w也会报内存溢出
dp[i][j] i代表状态前置和后置状态 j代表两个塔的插值
我们把左边塔当作第一目标
所以j+height[i]当作往左边塔放入砖块
j-height当作右边塔放入砖块 右边塔放入时高度也会增加
如果不放入就用前置状态
三个求最大值
代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int dp[2][2*N]; //第一维滚动状态 第二维两个塔的差值
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;
}

现在的我是真的弱。。下周面网易游戏、头条、美团。。good luck and fighting

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问题描述 小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌...
    RobotBerry阅读 833评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,763评论 0 89
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,289评论 3 52