前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。 同时给你一个二维整数数组 prices ,其中 prices[i] = [hi

2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。 同时给你一个二维整数数组 prices ,其中 prices[i] = [hi

原创
作者头像
福大大架构师每日一题
发布2022-09-13 21:40:12
4220
发布2022-09-13 21:40:12
举报
文章被收录于专栏:福大大架构师每日一题

2022-09-13:给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。

同时给你一个二维整数数组 prices ,其中 pricesi = 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(N**3)。

空间复杂度:O(N**2)。

代码用rust编写。代码如下:

代码语言: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
    }
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档