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):返回 ab 中的较大值。
    • min(a, b):返回 ab 中的较小值。
  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 堆的限制下,可以选择的最大硬币总数。
相关推荐
2501_908329853 分钟前
实时音频处理C++实现
开发语言·c++·算法
dapeng28703 分钟前
移动语义与完美转发详解
开发语言·c++·算法
bbbb3656 分钟前
算法工程中的可扩展性与分布式实现方案的技术7
算法
Shining05966 分钟前
AI 编译器系列(六)《Stable Diffusion 在 InfiniTensor 推理框架中的适配与工程实践》
人工智能·算法·stable diffusion·大模型·图像生成·ai编译器·infinitensor
佩奇大王7 分钟前
P159 摆动序列
java·开发语言·算法
北顾笙9807 分钟前
测开准备-day02数据结构力扣
数据结构
weixin_537590457 分钟前
《C程序设计语言》练习答案(练习1-7)
linux·c语言·算法
!停11 分钟前
C++基础入门(缺省参数,函数重载,引用)
开发语言·c++·算法
我不是秋秋12 分钟前
软件开发项目各角色关系解析:产品/前后端/测试如何高效协作?
java·算法·面试·职场和发展·哈希算法
Tisfy13 分钟前
LeetCode 1886.判断矩阵经轮转后是否一致:模拟
算法·leetcode·矩阵·题解·模拟