2024.3.15力扣每日一题——卖木头块

2024.3.15

      • 题目来源
      • 我的题解
        • 方法一 记忆化搜索(自顶向下)
        • 方法二 动态规划(自底向上)

题目来源

力扣每日一题;题序:2312

我的题解

方法一 记忆化搜索(自顶向下)

用 f(x,y)表示当木块的高和宽分别是 x 和 y 时,可以得到的最多钱数。我们需要考虑三种情况:

  • 如果数组 prices 中存在 (x,y,price) 这一三元组,那么可以将木块以 prices 的价格卖出。为了快速判断存在性,可以使用一个哈希映射来进行存储,即哈希映射的键为 ( h i h_i hi, w i w_i wi),值为 p r i c e i price_i pricei ,这样就可以根据木块的高和宽,在 O(1) 的时间得到对应的价格。这种情况的状态转移方程为:
    f(x,y)=price。
  • 如果 x>1,那么可以沿水平方向将木块切成两部分,它们的高分别是 i ( 1 ≤ i < x ) i~(1 \leq i < x) i (1i<x)和 x−i,宽均为 y。因此可以得到状态转移方程:
    f ( x , y ) = max ⁡ 1 ≤ i < x { f ( i , y ) + f ( x − i , y ) } f(x, y) = \max_{1 \leq i < x} \big\{ f(i, y) + f(x-i, y) \big\} f(x,y)=max1i<x{f(i,y)+f(xi,y)}
  • 如果 y>1,那么可以沿垂直方向将木块切成两部分,它们的宽分别是 j ( 1 ≤ j < y ) j~(1 \leq j < y) j (1j<y) 和 y−j,高均为 x。因此可以得到状态转移方程:
    f ( x , y ) = max ⁡ 1 ≤ j < y { f ( x , j ) + f ( x , y − j ) } f(x, y) = \max_{1 \leq j < y} \big\{ f(x, j) + f(x, y-j) \big\} f(x,y)=max1j<y{f(x,j)+f(x,yj)}

当有多种情况满足时,我们需要选择它们中的较大值。最终的答案即为 f(m,n)。

时间复杂度:O(mn(m+n)+p),其中 p 是数组 prices的长度。
空间复杂度:O(mn+p),即为哈希映射和动态规划的数组需要使用的空间。

public long sellingWood(int m, int n, int[][] prices) {Map<String, Integer> value = new HashMap<>();for (int[] price : prices) {value.put(price[0]+"-"+price[1], price[2]);}//记忆化搜索的备忘录long[][] memo = new long[m + 1][n + 1];for (long[] row : memo) {Arrays.fill(row, -1);}return dfs(m, n, value, memo);
}public long dfs(int x, int y, Map<String, Integer> value, long[][] memo) {if (memo[x][y] != -1) {return memo[x][y];}String key = x+"-"+y;long ret = value.containsKey(key) ? value.get(key) : 0;if (x > 1) {//沿水平方向切for (int i = 1; i < x; i++) {ret = Math.max(ret, dfs(i, y, value, memo) + dfs(x - i, y, value, memo));}}if (y > 1) {//沿垂直方向切for (int j = 1; j < y; j++) {ret = Math.max(ret, dfs(x, j, value, memo) + dfs(x, y - j, value, memo));}}memo[x][y] = ret;return ret;
}
方法二 动态规划(自底向上)

时间复杂度:O( m 2 + n 2 + p m^2+n^2+p m2+n2+p)
空间复杂度:O(mn+p)

public long sellingWood(int m, int n, int[][] prices) {Map<String, Integer> value = new HashMap<>();for (int[] price : prices) {value.put(price[0] + "-" + price[1], price[2]);}long[][] dp = new long[m + 1][n + 1];for (int x = 1; x <= m; x++) {for (int y = 1; y <= n; y++) {String key = x + "-" + y;long ret = value.containsKey(key) ? value.get(key) : 0;if (x > 1) {// 沿水平方向切for (int i = 1; i < x; i++) {ret = Math.max(ret, dp[i][y] + dp[x - i][y]);}}if (y > 1) {// 沿垂直方向切for (int j = 1; j < y; j++) {ret = Math.max(ret, dp[x][j] + dp[x][y - j]);}}dp[x][y] = ret;}}return dp[m][n];
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/794126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

firefox切换本地服务和全球服务的方法

方法1&#xff1a;“设置”>“同步">“切换全球/本地服务器” https://jingyan.baidu.com/article/1974b2898523bbb5b1f774e2.html 方法2&#xff1a;地址栏输入about:config&#xff0c;搜索首选项名称里输入identity.fxaccounts.autoconfig.uri&#xff0c;填入…

Docker Desktop 不支持 host 网络模式

先把这个结论的放在前面&#xff0c;直接访问链接就能看到官方文档中已经明确说了不支持。 参考链接&#xff1a;docker desktop for windows 不支持 host 网络模式 以前对于 docker 的网络模式&#xff0c;一直只是了解&#xff0c;没有亲自尝试过。结果今天在尝试 docker 的 …

react 父子组件的渲染机制 | 优化手段

文章目录 父子组件的渲染机制优化手段与实践写法父组件&#xff1a;下发stateprops.children 传递无状态组件props传递组件 React.memo缓存子组件与useCallback结合 父子组件的渲染机制 渲染分初次渲染和重新渲染 React组件会在两种情况下发生重新渲染 当组件自身的state发生…

如何同时安全高效管理多个谷歌账号?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

蓝桥集训之垒骰子

蓝桥集训之垒骰子 核心思想&#xff1a;矩阵乘法 f[i]存顶面数值 构造a矩阵 使得*f[i] f[i-1]a 则f[i] f[1] * an 快速幂优化 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N 6,m…

Oracle APEX 23.2版本 使用应用程序工作副本进行协作开发

现状描述&#xff1a; 当前APEX协作开发都是在同一应用程序下进行的&#xff0c;这样做有可能因同一时间对同一数据进行操作造成锁表或其他问题&#xff0c;Oracle APEX23.2版本迭代后新增了部分功能&#xff0c;可以创建应用程序的工作副本来修复错误、添加功能&#xff0c;然…

C++ setmap

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 一.树形结构的关联式容器 &#x…

移动开发技术历史演化简介h5,跨平台,原生的各种技术实现方案的简单介绍

移动端的开发技术是指针对移动设备如智能手机和平板电脑等便携终端进行应用程序和服务创建的过程。本文将主要介绍一下移动端的开发技术的历史进化历程。讲述h5&#xff0c;跨平台&#xff0c;原生的各种技术实现方案和他们各自的优势与不足。 移动开发&#xff0c;不仅是编程技…

在Ubuntu系统下连接远程Ubuntu服务器

本篇文章介绍&#xff0c;如何在Ubuntu系统下连接远程Ubuntu系统并传输文件。 一. 连接远程Ubuntu服务器。 1. 打开命令行&#xff0c;输入 : sudo apt-get update &#xff0c; 对系统进行更新。 2. 安装 OpenSSH Server&#xff0c;输入 &#xff1a; sudo apt-get insta…

聊一聊电子邮件?

电子邮件是什么&#xff1f; 电子邮件是一种基于客户/服务器架构的应用。功能是实现人与人之间的交流。直到现在&#xff0c;电子邮件依然是当前因特网 注意&#xff1a;基于客户/服务器方式和基于B/S架构不一样&#xff01;客户/服务器表示的范围更广&#xff0c;当基于客户…

Python 网络请求:深入理解Requests库

目录 引言 一、Requests库简介 二、安装与基本使用 三、requests库的特性与优势 四、requests库在实际应用中的案例 1.get请求 2.post请求 3.超时重试 4.headers设置 5.session会话 6.携带cookie​​​​​​​ 7.携带代理​​​​​​​ 8.携带身份认证​​​​​…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V1.0

爬虫&#xff1a;红网网站&#xff0c; 获取当月指定关键词新闻&#xff0c;并存储到CSV文件 V1.0 目标网站&#xff1a;红网 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#…

精进TypeScript--提供回调中this的类型

JavaScript 的 this 关键字是整个语言中最令人困惑的部分之一。与 let 和 const 声明的变量是具有词法作用域的&#xff0c;与之不同的是&#xff0c;this 是动态作用域&#xff1a;它的值不取决于它怎么定义&#xff0c;而取决于它怎么调用 要记住的事情&#xff1a; 了解 th…

【CSS】浮动笔记及案例

CSS浮动 1. 认识浮动 float属性可以指定一个元素沿着左侧或者是右侧放置&#xff0c;允许文本和内联元素环绕它 float属性最初只使用文字环绕图片但却是早起CSS最好用的左右布局方案 绝对定位、浮动都会让元素脱标&#xff0c;以达到灵活布局的目的可以通过float属性让元素脱…

UE4_材质节点

UE4_材质节点 2017-12-07 13:56 跑九宫格 跑UV 评论(0)

arm裸机-1、定时器pwm

时钟配置 我们使用s3c2440&#xff0c;主频12M&#xff0c;查看用户手册 通过锁相环抬升到400MHZ&#xff0c;分成三条通路&#xff0c;通过HHDIVN和PDIVN配置频率比&#xff0c;这个频率比配置手册已经给出。 配置MPLL主频400Mhz&#xff0c; 通过这个公式算出MPLL s、p、m都…

【XZ-Utils供应链后门漏洞(CVE-2024-3094)】

文章目录 前言 一、事件背景 二、漏洞概述 三、影响范围 四、漏洞检测 五、漏洞防护 前言 近期各个威胁情报中心通报了一例Linux漏洞&#xff0c;在清明节前我们也是进行了自查&#xff0c;幸运的是该漏洞还未集成在发行版中&#xff0c;得以及时发现&#xff0c;没有造…

hive 慢sql 查询

hive 慢sql 查询 查找 hive 执行日志存储路径&#xff08;一般是 hive-audit.log &#xff09; 比如&#xff1a;/var/log/Bigdata/audit/hive/hiveserver/hive-audit.log 解析日志 获取 执行时间 执行 OperationId 执行人 UserNameroot 执行sql 数据分隔符为 \001 并写入 hiv…

滑动窗口(尺取法/Python)

滑动窗口&#xff08;尺取法&#xff09; 算法含义&#xff1a; 在解决关于区间特性的题目时保存搜索区间左右端点&#xff0c;然后根据实际要求不断更新左右端点位置的算法 时间复杂度&#xff1a; O ( n ) O(n) O(n) 空间复杂度&#xff1a; O ( 1 ) O(1) O(1) 在历年真题…

C语言——调试技巧

1.Debug和Release的介绍 Debug 通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化&#xff0c;便于程序员调试程序。Release 称为发布版本&#xff0c;它往往是进行了各种优化&#xff0c;使得程序在代码大小和运行速度上都是最优 的&#xff0c;以便用…