2020-02-07 17:46:32

问题描述:

问题求解:

解法一:BF

看问题规模看似可以直接暴力解决。

如果直接去解肯定是会超时的,因为每次将原空间划分成A区域,B区域和剩余区域的时间复杂度为O(3 ^ n)。

但是我们可以将问题进行一下转化,之前有个问题是能否将一个数组中的数划分成两个和相等的子区域那个题目是可以使用dp完成求解的,时间复杂度是O(nsum)。

因此我们可以去构造出所有的挑选可能,并对每个可能产生解的可能去过一遍dp就能完成本题。

但是,本解法并不是最优解。

    int ret = 0;
int[] nums;
List<Integer> res = new ArrayList<>(); public int tallestBillboard(int[] rods) {
nums = rods;
helper(0, 0);
return ret;
} private void helper(int start, int sum) {
if (start >= nums.length) return;
if (sum % 2 == 0 && check(res, sum / 2)) {
ret = sum / 2;
}
helper(start + 1, sum);
res.add(nums[start]);
sum += nums[start];
if (sum % 2 == 0 && check(res, sum / 2)) {
ret = sum / 2;
}
helper(start + 1, sum);
sum -= nums[start];
res.remove(res.size() - 1);
} private boolean check(List<Integer> nums, int target) {
if (target <= ret) return false;
int[] dp = new int[target + 1];
dp[0] = 1;
for (int num : nums) {
for (int w = target; w >= num; w--) {
dp[w] |= dp[w - num];
}
}
return dp[target] == 1;
}

解法二:DP

事实上,本题可以直接使用dp求解。时间复杂度O(nSum),但是状态的定义有点特殊。

dp[i][j] : 取前i个数字,diff = j的最大公共区域。

dp[0][0] = 0, dp[i][j] = -inf

    int inf = (int)1e9;
public int tallestBillboard(int[] rods) {
int n = rods.length;
int sum = 0;
for (int num : rods) sum += num;
int[][] dp = new int[n + 1][sum + 1];
for (int i = 0; i <= n; i++) Arrays.fill(dp[i], -inf);
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= sum - rods[i - 1]; j++) {
// not use i
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j]);
// put on higher part
dp[i][j + rods[i - 1]] = Math.max(dp[i][j + rods[i - 1]], dp[i - 1][j]);
// put on lower part
dp[i][Math.abs(j - rods[i - 1])] = Math.max(dp[i][Math.abs(j - rods[i - 1])], dp[i - 1][j] + Math.min(j, rods[i - 1]));
}
}
return dp[n][0];
}

  

动态规划-01背包-Tallest Billboard的更多相关文章

  1. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  2. 【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale

    [题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它 ...

  3. 【洛谷】【动态规划/01背包】P1734 最大约数和

    [题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...

  4. Codeforce 370J Bottles(动态规划-01背包)

    题目链接:http://codeforces.com/problemset/problem/730/J 题目大意:有n个杯子, 每个杯子有两个值一个是已装水量,一个是可装水量.从一个杯子向另一个杯子倒 ...

  5. (动态规划 01背包 打印路径) CD --UVA --624

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/G 每个CD的时间不超过 20没有哪个CD的时间是超过N ...

  6. HDU 2546.饭卡-动态规划0-1背包

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. WUSTOJ 1311: 开心的金明(Java)动态规划-01背包

    题目链接:

  8. WUSTOJ 1308: 采药(Java)动态规划-01背包

    题目链接:

  9. HihoCoder - 1038 01背包 动态规划

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

随机推荐

  1. LiteOS内核教程01-IoT-Studio介绍及安装

    1. 物联网一站式开发工具 -- IoT Studio IoT Studio 是支持 LiteOS 嵌入式系统软件开发的工具,提供了代码编辑.编译.烧录 及调试等一站式开发体验,支持 C.C++.汇编 ...

  2. FastDfs安装文档

    安装顺序 libfastcommon fdfs_tracker ==> 依赖:Gcc.libevent.perl fdfs_storage FastDFS-nginx-module nginx ...

  3. 压力测试(八)-多节点JMeter分布式压测实战

    1.Jmeter4.0分布式压测准备工作 简介:讲解Linux服务器上jmeter进行分布式压测的相关准备工作 1.压测注意事项 the firewalls on the systems are tu ...

  4. 2020 新个税算的头疼?会 python,这都不是事儿...

    背景 今年疫情复工后,财务小姐姐给我们普及了2020年新个税的算法.. 听完之后的感觉就是:恩,原来是这么回事! 虽然是个小工薪阶级,但是对于扣多少税还是很关心的.于是拿起笔算了算2月份的个税,产生了 ...

  5. ZXingObjC直接引用第三方工程使用方法

    1.下载ZXingObjc压缩包,解压缩. 2.将文件拷贝到项目工程目录下 3.到工程目录中ZXingObjc文件夹中将ZXing的执行文件拖拽到项目中. 4.点击项目targets ——>Bu ...

  6. Simulink仿真入门到精通(七) Simulink的回调函数

    7.1 什么是回调函数 Callback functions(回调函数)是因某种操作而除法对其调用的函数,如按下按钮或双击操作等. 常用的Simulink回调函数可应用在以下场合: 打开Simulin ...

  7. LeetCode 136、137、260(只出现一次的数,异或性质及应用)

    First. 陈列一下“异或”的一些性质 异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1. 它与布尔运算的区别在于,当运算符两 ...

  8. 《52讲轻松搞定网络爬虫》读书笔记 —— HTTP基本原理

    URI 和 URL URI :Uniform Resource Identifier,即统一资源标志符, URL :Universal Resource Locator,即统一资源定位符. 举栗子,加 ...

  9. 大型Java进阶专题(四) 设计模式之工厂模式

    前言 ​ 今天开始我们专题的第三课了,开始对设计模式进行讲解,本章节介绍:了解设计模式的由来,介绍设计模式能帮我们解决那些问题以及剖析工厂模式的历史由来及应用场景.本章节参考资料书籍<Sprin ...

  10. TCP断开连接(四次挥手)

    四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...