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 堆的限制下,可以选择的最大硬币总数。
相关推荐
墨染点香2 小时前
LeetCode 刷题【144. 二叉树的前序遍历】
数据结构·算法·leetcode
cynicme7 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
im_AMBER10 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢10 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
寂静山林10 小时前
UVa 1030 Image Is Everything
算法
AI柠檬10 小时前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
weixin_4296302611 小时前
第6章 支持向量机
算法·机器学习·支持向量机
SweetCode11 小时前
C++ 实现大数加法
开发语言·c++·算法
王哈哈^_^11 小时前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
CodeWizard~11 小时前
AtCoder Beginner Contest 430赛后补题
c++·算法·图论