5254. 卖木头块 动态规划
5254. 卖木头块
给你两个整数
m
和n
,分别表示一块矩形木块的高和宽。同时给你一个二维整数数组prices
,其中prices[i] = [hi, wi, pricei]
表示你可以以pricei
元的价格卖一块高为hi
宽为wi
的矩形木块。每一次操作中,你必须按下述方式之一执行切割操作,以得到两块更小的矩形木块:
- 沿垂直方向按高度 完全 切割木块,或
- 沿水平方向按宽度 完全 切割木块
在将一块木块切成若干小木块后,你可以根据
prices
卖木块。你可以卖多块同样尺寸的木块。你不需要将所有小木块都卖出去。你 不能 旋转切好后木块的高和宽。请你返回切割一块大小为
m x n
的木块后,能得到的 最多 钱数。注意你可以切割木块任意次。
示例 1:
输入:m = 3, n = 5, prices = [[1,4,2],[2,2,7],[2,1,3]] 输出:19 解释:上图展示了一个可行的方案。包括: - 2 块 2 x 2 的小木块,售出 2 * 7 = 14 元。 - 1 块 2 x 1 的小木块,售出 1 * 3 = 3 元。 - 1 块 1 x 4 的小木块,售出 1 * 2 = 2 元。 总共售出 14 + 3 + 2 = 19 元。 19 元是最多能得到的钱数。示例 2:
输入:m = 4, n = 6, prices = [[3,2,10],[1,4,2],[4,1,3]] 输出:32 解释:上图展示了一个可行的方案。包括: - 3 块 3 x 2 的小木块,售出 3 * 10 = 30 元。 - 1 块 1 x 4 的小木块,售出 1 * 2 = 2 元。 总共售出 30 + 2 = 32 元。 32 元是最多能得到的钱数。 注意我们不能旋转 1 x 4 的木块来得到 4 x 1 的木块。提示:
1 <= m, n <= 200
1 <= prices.length <= 2 * 104
prices[i].length == 3
1 <= hi <= m
1 <= wi <= n
1 <= pricei <= 10^6
- 所有
(hi, wi)
互不相同 。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/selling-pieces-of-wood
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题结果
成功,但是周赛时写的太丑了,记忆化搜索,又长又难看,效率还低,所以看群里那么多人说动态规划可以,按动态规划自己写了试了下,快好多,代码又短,觉得自己道行还不够深
方法1:记忆化搜索
1. 找行列分割点,排序(方便提前跳出)
2. cache 记录是否搜索过,如果搜索过,直接返回
3. 尝试横着切,如果行分割点在当前行数之后,跳过
4. 尝试竖着切,如果列分割点在当前列数之后,跳过
5. 假设刚好这么大,可以不分割,直接用现在的值试试
6. 取横、竖、自己三者最大值返回(此时缓存到cache中)
class Solution {public long sellingWood(int m, int n, int[][] prices) {//1.所有的行Set<Integer> ls = new HashSet<>();Set<Integer> cs = new HashSet<>();Map<Integer,Map<Integer,Integer>> mapPrice = new HashMap<>();for(int[] price:prices){ls.add(price[0]);cs.add(price[1]);mapPrice.putIfAbsent(price[0],new HashMap<>());mapPrice.get(price[0]).put(price[1],price[2]);}List<Integer> lineList = new ArrayList<>(ls);List<Integer> colList = new ArrayList<>(cs);Collections.sort(lineList);Collections.sort(colList);long ans = dfs(lineList,colList,mapPrice,m,n);return ans;}Map<Integer,Long> cache = new HashMap<>();private long dfs(List<Integer> lineList,List<Integer> colList, Map<Integer,Map<Integer,Integer>> mapPrice, int m, int n){if(cache.containsKey(m*200+n)) return cache.get(m*200+n);//按行分割。。。long curr = 0L;for(int i = 0; i < colList.size()&&colList.get(i)<n; i++){long a = dfs(lineList,colList,mapPrice,m,colList.get(i));long b = dfs(lineList,colList,mapPrice,m,n-colList.get(i));curr = Math.max(curr,a+b);}for(int i = 0; i < lineList.size()&&lineList.get(i)<m; i++){long a = dfs(lineList,colList,mapPrice,lineList.get(i),n);long b = dfs(lineList,colList,mapPrice,m-lineList.get(i),n);curr = Math.max(curr,a+b);}//不分if(mapPrice.containsKey(m) && mapPrice.get(m).containsKey(n)){curr = Math.max(curr,mapPrice.get(m).get(n));}cache.put(m*200+n,curr);return curr;}}
时间复杂度:O(mn)
空间复杂度:O(mn)
方法2:动态规划
1. 尝试在长度为 i,宽度为 j 的木头上进行切割,如果刚好行列等于当前行列,进行比较赋值
2. 加了当前木头之后,对于原本长宽大于等于它的,都可能获得更优解,每个长宽需要计算按旧方案、按行分割、按列分割三种情形下的更优解
class Solution {public long sellingWood(int m, int n, int[][] prices) {long[][] dp = new long[m+1][n+1];for(int [] price:prices){int x = price[0];int y = price[1];int p = price[2];dp[x][y] = Math.max(dp[x][y],p);for(int i = x; i <= m; i++){for(int j = y; j <= n; j++){dp[i][j] = Math.max(dp[i][j],Math.max(dp[i-x][j]+dp[x][j],dp[i][j-y]+dp[i][y]));}}}return dp[m][n];}}
时间复杂度:O(mn)
空间复杂度:O(mn)
5254. 卖木头块 动态规划相关推荐
- 2312、卖木头块 | 面试官与狂徒张三的那些事(leetcode,附思维导图 + 全部解法)
零 标题:算法(leetcode,附思维导图 + 全部解法)300题之(2312)卖木头块 一 题目描述 二 解法总览(思维导图) 三 全部解法 面试官:看你准备得差不多了,我们开始面试吧. 狂徒张三 ...
- LeetCode 2312. 卖木头块
2312. 卖木头块 [分治+记忆化搜索]利用分治的思想,先给m*n的大矩形切一刀,然后分成了两个矩形,接着递归处理这两个矩形,把所有可能的切法的结果取最大值即可,但是需要注意i*j的矩形可能通过先横 ...
- 卖肾换来一部iPhone后生活不能自理,那手机电商平台现在卖10块钱!
本文来自公众号"电商报",TechWeb经授权发布 ID | kandianshang 作者 | 电商君 九年前, 有人卖掉一个肾换来一部iPhone 4! 上帝欲让人灭亡,必先让 ...
- 70进货卖100利润是多少_进货价8块的产品,在网上卖100块,这个电商卖家能赚多少!...
在前几期的文章里,我有发布一个关于<8块的进货价,卖100块给别人翻了20倍,这个电商玩法值得了解>,然后就有人问我怎么在亚马逊上面开店,还有人评论说快递费就很贵. 这一期的文章就大家聊一 ...
- JS一百只鸡卖一百块钱,公鸡5元,母鸡3元,三只小鸡一元
思路:穷举 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8 ...
- 力扣——第298场周赛
力扣--第298场周赛 5242. 兼具大小写的最好英文字母 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母.返回的字母必须为大写形式.如果不存在满足条件的字母,则返回 ...
- 动态规划经典问题整理
单序列: 最长连续递增序列 最长递增子序列 最长递增子序列的个数 最大子序和 最大整除子集 爬楼梯最长定差子序列 爬楼梯 使用最小花费爬楼梯 比特位计数 旋转数字 把数字翻译成字符串 青 ...
- 70进货卖100利润是多少_3个暴利行业,进货价几十块,售卖几百块
我前段时间分享了一篇关于电商行业的暴利产品,大概讲的就是进货成本3块钱的东西,可以卖到55块:而且根据电商平台的统计,有60%的人喜欢55-118块区间的价格 我分享了那篇文章后,看见很多人评论说:这 ...
- 一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱
一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱? 这是IBM面试时的题目,有四种算法: 1.9-8=1,11-10=1,1+1=2,所以最后赚2元. 2.最初只有8 ...
- 【基础算法】切割钢管与动态规划
尽管排序算法还有很多没有说,但因为这篇文章是已经现成有的,就先上这个,回头再把排序补一下. 好的开始~BigMoyan有一个好基友叫zou先生,zou先生除了是BigMoyan在学校的社团老大外,还是 ...
最新文章
- python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...
- “约见”面试官系列之常见面试题第二十五篇之对vue-router的理解(建议收藏)
- python自动化框架pytest pdf_Python 自动化测试框架 unittest 和 pytest 对比
- Django,js,html数据传输
- php微信公众号过滤微信qq表情
- Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
- 巨杉数据库登榜互联网周刊“2022中国软件150强”及“2022大数据服务TOP150”
- 高德打车宣布上线共享雨伞:或许是醉翁之意不在酒
- linux系统 系统推荐 deepin国产系统 最好用的国产linux系统 Windows系统的优秀替代品 deepin系统安装 系统安装 deepin
- ffmpeg学习——音频源
- android 符号表情显示乱码,android输入框限制输入法中的表情符号
- Gartner 2022 应用安全测试魔力象限
- 用“小花生”-阅读记录app坚持打卡快3年,我带儿子在学前实现中英文阅读量4500本 ...
- python必备常用英语词汇
- 【转】网站流量UV是什么意思?什么是流量UV?
- data.frame中的NA值怎么替换成0 把na变为0 把na变为想要的数 改变na 是否为na is.na()是否为null is.null() is.null() 删除去掉NA的行
- G. Gangsters in Central City
- PhotoShop实现文字人物海报效果
- kotlin常用语法扫盲及开发注意点,勿错失(持续更新)
- 一款简单的单页网址导航源码