2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。 同时给你一个二维整数数组 prices ,其中 prices[i] = [hi, wi, pricei] 表示你可以
2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。
同时给你一个二维整数数组 prices ,其中 prices[i] = [hi, wi, pricei]
表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。
每一次操作中,你必须按下述方式之一执行切割操作,以得到两块更小的矩形木块:
沿垂直方向按高度 完全 切割木块,或
沿水平方向按宽度 完全 切割木块
在将一块木块切成若干小木块后,你可以根据 prices 卖木块。
你可以卖多块同样尺寸的木块。
你不需要将所有小木块都卖出去。
你 不能 旋转切好后木块的高和宽。
请你返回切割一块大小为 m x n 的木块后,能得到的 最多 钱数。
注意你可以切割木块任意次。
输入:m = 4, n = 6, prices = [[3,2,10],[1,4,2],[4,1,3]]。
输出:32。
答案2022-09-13:
严格位置依赖的动态规划版本 + 优化。
优化1 : 递归的形式,改成迭代形式;
优化2 : prices中的单块收益直接填入dp表即可,如果有更好的分割方案,更新掉;
优化3 : 分割只需要枚举一半即可。
时间复杂度:O(N3)。
空间复杂度:O(N2)。
代码用rust编写。代码如下:
fn main() {
let mut arr = vec![vec![3, 2, 10], vec![1, 4, 2], vec![4, 1, 3]];
let ans = selling_wood3(4, 6, &mut arr);
println!("ans = {}", ans);
}
fn selling_wood3(m: i64, n: i64, prices: &mut Vec<Vec<i64>>) -> i64 {
// dp表!
let mut dp: Vec<Vec<i64>> = vec![];
for i in 0..m + 1 {
dp.push(vec![]);
for _ in 0..n + 1 {
dp[i as usize].push(0);
}
}
for p in prices.iter() {
// {3, 5, 100}
// 0 1 2
// dp[3][5] = 100
dp[p[0] as usize][p[1] as usize] = p[2];
}
for i in 1..=m {
for j in 1..=n {
// 垂直分割
// i * j = 100 * 100
// dp[100][1] + dp[100][99]
// dp[100][2] + dp[100][98]
// ..
for k in 1..=(j >> 1) {
dp[i as usize][j as usize] = get_max(
dp[i as usize][j as usize],
dp[i as usize][k as usize] + dp[i as usize][(j - k) as usize],
);
}
// 水平分割
// 100 * 100
// 1) 1 * 100 + 99 * 100
// 1) 2 * 100 + 98 * 100
// i * j
// 1) 1 * j + (i - 1) * i;
// 2) 2 * j + (i - 2) * j;
// k) k * j + (i - k) * j;
for k in 1..=(i >> 1) {
dp[i as usize][j as usize] = get_max(
dp[i as usize][j as usize],
dp[k as usize][j as usize] + dp[(i - k) as usize][j as usize],
);
}
}
}
return dp[m as usize][n as usize];
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
执行结果如下:

2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。 同时给你一个二维整数数组 prices ,其中 prices[i] = [hi, wi, pricei] 表示你可以的更多相关文章
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n ...
- [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...
- python 一个二维数组和一个整数,判断数组中是否含有该整数
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. de ...
- PHP将两个二维数组合并为一个二维数组的方法
$a = array(0 => Array(id => 66,class_name => math),1 => Array(id => 67,class_name =&g ...
- C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?
如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array. ...
- Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)
自2019年10月首次发布以来,Dapr(Distributed Application Runtime,分布式应用运行时)因其"更稳定"."更可靠".&quo ...
- 利用预编译解决C/C++重复定义的错误 -2020.09.13
利用预编译解决C/C++重复定义的错误 -2020.09.13 我们现在有main.c和function.h两个文件 main.c #include <stdio.h> #include ...
- xlslib安装, aclocal-1.13: command not found, 安装升级autoconf-2.65.tar.gz, automake-1.13.tar.gz两个文件
问题1: $ make CDPATH="${ZSH_VERSION+.}:" && cd . && aclocal-1.13 -I m4 /bin/ ...
- 求一个int型整数的两种递减数之和(java)--2015华为机试题
题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的 ...
- Python算法每日一题--001--给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
随机推荐
- go设置http代理
打算把之前python写的程序切换到golang, 结果调试时发现fiddler无法正常捕获go的http请求 需要设置代理才可以正常捕获 const HttpProxyUrl = "htt ...
- 3---java中的集合
集合是什么:表示一组元素的对象,有的是有序的,有的是无序的,有的是可重复的,有的是不可重复的. 首先根是:Collection 1:Set 没有重复元素 SortedSet 有序的Set 2:Lis ...
- nginx 代理路径
反向代理被代理url没有截取 /report/api/ /report/api/bussinessRisk/zhucai/creditInquiry 应该是/bussinessRisk/zhucai/ ...
- vue-print-nb的应用
1.cnpm i vue-print-nb 2.触发事件:v-print="printObj" 3.触发的是个对象: printObj:{ id: ...
- IDEA中使用JDBC连接MySQL数据库报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 的解决方法
在IDEA中使用JDBC连接MySQL,程序运行之后报错: 定位到第16行: 根据上面报错提示,在url参数字段最前面添加参数 useSSL=false : 再次运行程序,成功连接到数据库!
- 👋 和我一起学【Three.js】「初级篇」:0. 总论
「和我一起学 XXX」是我 2023 年的一个新企划,目的是向读者(也包括未来的自己)介绍我正在学习的某项新技术.文章会通过长期反复迭代的方式保持其内容的新鲜度.文章有较大内容更新时,会在文章开头进行 ...
- Feign调用报错The bean 'XXX.FeignClientSpecification', defined in null, could not be registered....的解决办法
问题描述: 创建了两个远程调用类,一个是调用退款的,一个是调用折扣的 但是两个调用类是调用的同一个微服务 都叫@FeignClient(value = "xxx-shop") 如何 ...
- 全球IP whois信息获取与情报挖掘
全球IP的whois信息获取与情报挖掘 什么是whois信息? Whois是一种网络协议,也是一种网络服务,能够让客户端查询域名或者IP是否注册,以及注册人的相关信息.我们通常所说的whois信息就是 ...
- day07-SpringBoot接收参数相关注解
SpringBoot接收参数相关注解 1.基本介绍 SpringBoot接收客户端提交数据/参数会使用到相关注解 详解@PathVariable.@RequestHeader.@ModelAttrib ...
- Go 语言 new 和 make 关键字的区别
原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...