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. 卖木头块 动态规划相关推荐

  1. 2312、卖木头块 | 面试官与狂徒张三的那些事(leetcode,附思维导图 + 全部解法)

    零 标题:算法(leetcode,附思维导图 + 全部解法)300题之(2312)卖木头块 一 题目描述 二 解法总览(思维导图) 三 全部解法 面试官:看你准备得差不多了,我们开始面试吧. 狂徒张三 ...

  2. LeetCode 2312. 卖木头块

    2312. 卖木头块 [分治+记忆化搜索]利用分治的思想,先给m*n的大矩形切一刀,然后分成了两个矩形,接着递归处理这两个矩形,把所有可能的切法的结果取最大值即可,但是需要注意i*j的矩形可能通过先横 ...

  3. 卖肾换来一部iPhone后生活不能自理,那手机电商平台现在卖10块钱!

    本文来自公众号"电商报",TechWeb经授权发布 ID | kandianshang 作者 | 电商君 九年前, 有人卖掉一个肾换来一部iPhone 4! 上帝欲让人灭亡,必先让 ...

  4. 70进货卖100利润是多少_进货价8块的产品,在网上卖100块,这个电商卖家能赚多少!...

    在前几期的文章里,我有发布一个关于<8块的进货价,卖100块给别人翻了20倍,这个电商玩法值得了解>,然后就有人问我怎么在亚马逊上面开店,还有人评论说快递费就很贵. 这一期的文章就大家聊一 ...

  5. JS一百只鸡卖一百块钱,公鸡5元,母鸡3元,三只小鸡一元

    思路:穷举 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8 ...

  6. 力扣——第298场周赛

    力扣--第298场周赛 5242. 兼具大小写的最好英文字母 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母.返回的字母必须为大写形式.如果不存在满足条件的字母,则返回 ...

  7. 动态规划经典问题整理

    单序列: 最长连续递增序列  最长递增子序列   最长递增子序列的个数  最大子序和   最大整除子集 爬楼梯最长定差子序列  爬楼梯 使用最小花费爬楼梯 比特位计数 旋转数字 把数字翻译成字符串 青 ...

  8. 70进货卖100利润是多少_3个暴利行业,进货价几十块,售卖几百块

    我前段时间分享了一篇关于电商行业的暴利产品,大概讲的就是进货成本3块钱的东西,可以卖到55块:而且根据电商平台的统计,有60%的人喜欢55-118块区间的价格 我分享了那篇文章后,看见很多人评论说:这 ...

  9. 一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱

    一个人花8块钱买了只鸡,9块钱卖了,又10块钱买回来,11块钱又卖了,他赚了多少钱? 这是IBM面试时的题目,有四种算法: 1.9-8=1,11-10=1,1+1=2,所以最后赚2元. 2.最初只有8 ...

  10. 【基础算法】切割钢管与动态规划

    尽管排序算法还有很多没有说,但因为这篇文章是已经现成有的,就先上这个,回头再把排序补一下. 好的开始~BigMoyan有一个好基友叫zou先生,zou先生除了是BigMoyan在学校的社团老大外,还是 ...

最新文章

  1. python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...
  2. “约见”面试官系列之常见面试题第二十五篇之对vue-router的理解(建议收藏)
  3. python自动化框架pytest pdf_Python 自动化测试框架 unittest 和 pytest 对比
  4. Django,js,html数据传输
  5. php微信公众号过滤微信qq表情
  6. Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
  7. 巨杉数据库登榜互联网周刊“2022中国软件150强”及“2022大数据服务TOP150”
  8. 高德打车宣布上线共享雨伞:或许是醉翁之意不在酒
  9. linux系统 系统推荐 deepin国产系统 最好用的国产linux系统 Windows系统的优秀替代品 deepin系统安装 系统安装 deepin
  10. ffmpeg学习——音频源
  11. android 符号表情显示乱码,android输入框限制输入法中的表情符号
  12. Gartner 2022 应用安全测试魔力象限
  13. 用“小花生”-阅读记录app坚持打卡快3年,我带儿子在学前实现中英文阅读量4500本 ...
  14. python必备常用英语词汇
  15. 【转】网站流量UV是什么意思?什么是流量UV?
  16. data.frame中的NA值怎么替换成0 把na变为0 把na变为想要的数 改变na 是否为na is.na()是否为null is.null() is.null() 删除去掉NA的行
  17. G. Gangsters in Central City
  18. PhotoShop实现文字人物海报效果
  19. kotlin常用语法扫盲及开发注意点,勿错失(持续更新)
  20. 一款简单的单页网址导航源码

热门文章

  1. 聊天记录软件工作记录
  2. 纯css实现各种箭头图片效果
  3. oracle biee资料库,Hello oracle BIEE 资料
  4. 打游戏计算机内存不足,玩游戏老提示内存不足怎么办
  5. 【算法】生成n个互异随机数的初步算法
  6. Office word中去掉首页的页眉
  7. 杭州电子科技大学计算机考研复试分数线,杭州电子科技大学2020年考研复试分数线...
  8. macbook 鼠标光标乱跳解决
  9. virtual box 静态ip设置
  10. vue设置页面取消滚动和可以滚动