Leecode刷题C语言之切蛋糕的最小总开销①

devtools/2024/12/26 12:11:30/

执行结果:通过

执行用时和内存消耗如下:

 

 

 

 

int idx(int m, int n, int row1, int col1, int row2, int col2) {return (row1 * n + col1) * m * n + row2 * n + col2;
}int dp(int m, int n, int row1, int col1, int row2, int col2, int *horizontalCut, int *verticalCut, int *cache) {if (row1 == row2 && col1 == col2) {return 0;}int ind = idx(m, n, row1, col1, row2, col2);if (cache[ind] >= 0) {return cache[ind];}cache[ind] = INT_MAX;for (int i = row1; i < row2; i++) {cache[ind] = fmin(cache[ind], dp(m, n, row1, col1, i, col2, horizontalCut, verticalCut, cache) + dp(m, n, i + 1, col1, row2, col2, horizontalCut, verticalCut, cache) + horizontalCut[i]);}for (int i = col1; i < col2; i++) {cache[ind] = fmin(cache[ind], dp(m, n, row1, col1, row2, i, horizontalCut, verticalCut, cache) + dp(m, n, row1, i + 1, row2, col2, horizontalCut, verticalCut, cache) + verticalCut[i]);}return cache[ind];
}int minimumCost(int m, int n, int *horizontalCut, int horizontalCutSize, int *verticalCut, int verticalCutSize) {int *cache = (int *)malloc(m * m * n * n * sizeof(int));memset(cache, 0xff, m * m * n * n * sizeof(int));int res = dp(m, n, 0, 0, m - 1, n - 1, horizontalCut, verticalCut, cache);free(cache);return res;
}

解题思路:

这段代码实现了一个动态规划算法,用于计算将一个矩形切割成多个小矩形的最小成本。矩形的切割可以通过水平方向和垂直方向的切割线来完成。水平方向和垂直方向的切割成本分别由两个数组给出:horizontalCut 和 verticalCut。下面是详细的思路分析:

1. idx 函数

  • 目的:生成一个唯一索引,用于在缓存数组 cache 中标识从 (row1, col1) 到 (row2, col2) 区域的切割问题的状态。
  • 实现:首先计算 (row1, col1) 在整个矩形中的一维索引,然后乘以整个矩形的面积(m * n),再加上 (row2, col2) 在剩余部分中的一维索引。
  • 公式(row1 * n + col1) * m * n + row2 * n + col2
    • row1 * n + col1:计算 (row1, col1) 在一维数组中的位置。
    • 乘以 m * n:将一维索引转换到整个二维空间的唯一索引。
    • 加上 row2 * n + col2:计算 (row2, col2) 在剩余部分(从 (row1, col1) 视角看)中的一维索引。

2. dp 函数

  • 目的:使用动态规划计算从 (row1, col1) 到 (row2, col2) 区域切割的最小成本。
  • 基本情况:如果 row1 == row2 && col1 == col2,说明没有需要切割的区域,返回 0。
  • 缓存:使用 cache 数组存储已经计算过的状态,避免重复计算。
  • 递归分割
    • 尝试所有可能的水平切割线(从 row1 到 row2-1),计算并更新最小成本。
    • 尝试所有可能的垂直切割线(从 col1 到 col2-1),计算并更新最小成本。
    • 每次切割的成本是当前切割线的成本加上分割后两部分的最小切割成本之和。
  • 返回:缓存中存储的最小成本。

3. minimumCost 函数

  • 目的:计算整个矩形(从 (0, 0) 到 (m-1, n-1))切割的最小成本。
  • 初始化缓存:分配并初始化缓存数组 cache,所有值初始化为 -1(使用 0xff 填充,表示未计算状态)。
  • 调用动态规划函数:调用 dp 函数计算最小成本。
  • 释放内存:释放缓存数组 cache 的内存。
  • 返回:计算出的最小成本。

总结

这段代码通过动态规划解决了矩形切割的最小成本问题。它首先将二维切割问题映射到一个一维索引空间,然后利用缓存避免重复计算,并通过递归尝试所有可能的切割线来找到最小成本。这种方法有效地解决了一个复杂的组合优化问题。

 


http://www.ppmy.cn/devtools/145522.html

相关文章

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

如何进行POC概念验证

进行 POC&#xff08;Proof of Concept&#xff0c;概念验证&#xff09; 的目的是验证某个想法、技术或方案的可行性。以下是进行 POC 的详细步骤&#xff1a; 1. 明确目标和范围 定义问题&#xff1a;明确你要解决的核心问题或验证的关键点。 设定目标&#xff1a;确定 POC …

(Python+selenium)UI自动化测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们在进行UI自动化测试时&#xff0c;一般采用javaselenium或者pythonselenium的方式。由于python比较简单&#xff0c;上手快&#xff0c;因此建议大家采用pyt…

basic_ios及其衍生库(附 GCC libstdc++源代码)

basic_ios及其衍生库(附 GCC libstdc源代码) 我们由这张图展开我们的讨论 对于Date对象&#xff0c;只有实现了<<重载到输出流才可以插入到stringstream ss中 现在我有疑问stringstream是怎么做到既能输出又能输入的&#xff1f; 而且为什么stringstream对象能传给ostre…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

全国硕士研究生入学考试(考研)常识详解之复试考试科目:笔试、面试与加试

全国硕士研究生入学考试&#xff08;考研&#xff09;常识详解之复试考试科目&#xff1a;笔试、面试与加试 硕士研究生入学考试的复试是对考生进行全面评估的重要环节&#xff0c;旨在考察考生的专业知识、综合素质及科研潜力。复试主要包括笔试与面试两大核心部分&#xff0…

Windows脚本清理C盘缓存

方法一&#xff1a;使用power文件.ps1的文件 脚本功能 清理临时文件夹&#xff1a; 当前用户的临时文件夹&#xff08;%Temp%&#xff09;。系统临时文件夹&#xff08;C:\Windows\Temp&#xff09;。 清理 Windows 更新缓存&#xff1a; 删除 Windows 更新下载缓存&#xff0…

软件测试之单元测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分&#xff0c;黑盒测试顾名思义就是我们不了解盒子的内部结构&#xff0c;我们通过文档或者对该功能的理解&#xff0c…