当前位置: 首页 > article >正文

Leecode刷题C语言之从栈中取出K个硬币的最大面积和

执行结果:通过

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

 

 

 

#define max(a, b)   ((a) > (b) ? (a) : (b))
#define min(a, b)   ((a) < (b) ? (a) : (b))

int maxValueOfCoins(int** piles, int pilesSize, int* pilesColSize, int k){
    int dp[k + 1], tdp[k + 1];
    int i, j, p, q, ans = 0;
    memset(dp, 0, sizeof(int) * (k + 1));

    for (i = 1; i <= pilesSize; i++) {
        for (j = 1; j < pilesColSize[i - 1]; j++) {
            piles[i - 1][j] += piles[i - 1][j - 1];
        }
        memcpy(tdp, dp, sizeof(int) * (k + 1));
        for (j = 1; j <= k; j++) {
            q = min(j, pilesColSize[i - 1]);
            for (p = 0; p <= q; p++) {
                dp[j] = max(dp[j], tdp[j - p] + (p > 0 ? piles[i - 1][p - 1] : 0));
            }
        }
    }
    return dp[k];
}

解题思路:

  1. 宏定义
    • max(a, b):返回 a 和 b 中的较大值。
    • min(a, b):返回 a 和 b 中的较小值。
  2. 动态规划数组初始化
    • dp[k + 1] 和 tdp[k + 1]dp 数组用于存储当前状态下的最优解,tdp 数组作为临时数组,用于存储上一个状态的最优解,以便在更新 dp 时不会覆盖未使用的旧值。数组大小为 k + 1,因为可以选择的堆数从 0 到 k
  3. 预处理每堆硬币的累积和
    • 遍历每一堆硬币 piles[i - 1](注意数组索引从 0 开始,但堆的索引从 1 开始考虑,所以这里用 i - 1),将每堆硬币转化为累积和数组。即 piles[i - 1][j] 表示从第 1 堆到第 j 堆的累积硬币数量。这样做是为了方便后续直接通过索引获取任意连续堆的硬币总数。
  4. 动态规划状态转移
    • 外层循环遍历每一堆硬币。
    • 使用 memcpy 复制 dp 数组到 tdp 数组,以保存上一个状态的最优解。
    • 内层循环遍历所有可能的堆数 j(从 1 到 k)。
      • q = min(j, pilesColSize[i - 1]):确定在当前堆数限制下,最多可以选择多少堆。
      • 再内层循环遍历从 0 到 q 的所有可能选择堆数 p
        • dp[j] = max(dp[j], tdp[j - p] + (p > 0 ? piles[i - 1][p - 1] : 0)):尝试更新状态。这里 tdp[j - p] 表示选择前 i-1 堆中 j-p 堆的最大硬币数,piles[i - 1][p - 1] 表示选择当前堆的前 p 堆的累积硬币数(注意这里因为累积和的原因,piles[i - 1][p - 1] 实际表示的是前 p 堆的总和,而非单独第 p 堆)。如果 p 为 0,即不选择当前堆的任何部分,则硬币数为 0。
  5. 返回结果
    • 最终返回 dp[k],表示在不超过 k 堆的限制下,可以选择的最大硬币总数。

http://www.kler.cn/a/514825.html

相关文章:

  • JSqlParser:Java SQL 解析利器
  • 微前端qiankun的基本使用(vue-element-admin作为项目模版)
  • 低代码系统-产品架构案例介绍、明道云(七)
  • MDX语言的语法糖
  • 【HarmonyOS NEXT】华为分享-碰一碰开发分享
  • C#与AI的共同发展
  • node.js 07.npm下包慢的问题与nrm的使用
  • Java 设计模式一
  • 聚类OTU vs 降噪识别生物序列——谁将主宰扩增子领域未来
  • CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅
  • Markdown Viewer 浏览器, vscode
  • 如何为64位LabVIEW配置正确的驱动程序
  • 基于STM32F103驱动AD7606串行采集数据信号
  • C++之初识模版
  • 安卓APP如何适配不同的手机分辨率
  • 【动态规划】--- 斐波那契数模型
  • 短剧系统开发功能需求/APP开发/源码指南
  • 计算在不规则形状内不同结构的占比
  • winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件
  • 鸿蒙开发入门之Hello World
  • 炸场硅谷,大模型“蒸汽机”迎来“瓦特时刻”
  • 论文速读|Multi-Modal Disordered Representation Learning Network for TBPS.AAAI24
  • 错误记录(二)virtualbox连共享文件夹
  • 09_异步加载_单例模式_常量类配置_不可销毁
  • Spring MVC(二)
  • Unreal Engine 5 C++ Advanced Action RPG 十一章笔记