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

Leecode刷题C语言之购买水果需要的最小金币数

执行结果:通过

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

 

 

 

int dp(int* prices, int pricesSize, int index, int* memo) {
    if (2 * index + 2 >= pricesSize) {
        return prices[index];
    }
    if (memo[index] == -1) {
        int minValue = INT_MAX;
        for (int i = index + 1; i <= 2 * index + 2; i++) {
            minValue = fmin(minValue, dp(prices, pricesSize, i, memo));
        }
        memo[index] = prices[index] + minValue;
    }
    return memo[index];
}

int minimumCoins(int* prices, int pricesSize) {
    int *memo = (int*)malloc(pricesSize * sizeof(int));
    for (int i = 0; i < pricesSize; i++) {
        memo[i] = -1;
    }
    return dp(prices, pricesSize, 0, memo);
}

解题思路:

这段代码的目的是解决一个特定类型的动态规划问题,其中涉及到在给定的价格数组 prices 中选择若干元素,使得所选元素的总和最小,但有一个特殊的约束条件:如果你选择了价格数组中的第 i 个元素,那么你只能选择第 i+1i+2, ..., 或 2*i+2 个元素作为下一个要选择的元素(如果存在的话)。下面详细解释这段代码的思路:

  1. 定义问题
    • 输入:一个整数数组 prices 和数组的大小 pricesSize
    • 输出:在满足上述约束条件的前提下,从 prices 中选择若干元素所能得到的最小总和。
  2. 动态规划(DP)思路
    • 使用一个递归函数 dp(prices, pricesSize, index, memo) 来计算从 index 位置开始选择元素的最小总和。
    • memo 数组用于存储中间结果,以避免重复计算。memo[i] 存储的是从第 i 个位置开始的最小总和。
  3. 递归函数 dp 的逻辑
    • 基本情况:如果当前位置 index 之后的可选范围超出了数组边界(即 2 * index + 2 >= pricesSize),则直接返回当前位置的价格 prices[index],因为没有后续元素可选。
    • 记忆化:检查 memo[index] 是否已经被计算过(即不等于 -1)。如果是,则直接返回 memo[index]
    • 递归计算:如果 memo[index] 未被计算,遍历从 index + 1 到 2 * index + 2 的所有可能下一个选择位置 i,对每个位置递归调用 dp 函数,找到这些选择中的最小值 minValue
    • 更新 memo:将当前位置 index 的最小总和更新为 prices[index] + minValue,并存储在 memo[index] 中。
    • 返回结果:返回 memo[index]
  4. 主函数 minimumCoins
    • 分配内存并初始化 memo 数组,所有元素初始化为 -1,表示尚未计算。
    • 从位置 0 开始调用递归函数 dp,并返回其结果作为最终的最小总和。
  5. 内存管理
    • 在实际使用中,这段代码应该在适当的地方释放 memo 数组分配的内存,以避免内存泄漏。不过,在提供的代码片段中,没有显示释放内存的操作。

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

相关文章:

  • [特殊字符]【计算机视觉】r=2 采样滤波器全解析 ✨
  • 99.16 金融难点通俗解释:营业总收入
  • 到华为考场考HCIE的注意事项和考试流程
  • leetcode28-找出字符串中第一个匹配的下标
  • 寒假1.23
  • RabbitMQ---面试题
  • 【实践】Python实现气象数据分析与可视化
  • Ubuntu 安装 QGIS LTR 3.34
  • SVN客户端使用手册
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250124
  • 计算机视觉算法实战——图像生成
  • Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台,也就是一个“云上之云”。
  • 【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
  • 总结与展望,龙蜥社区第 30 次运营委员会会议线上召开
  • 探究 Facebook 隐私安全发展方向,未来走向何方?
  • 深度学习算法:从基础到实践
  • RV1126画面质量三:QP调节
  • 实现GD32F470作为高速USB主机与USB鼠标通信的功能
  • uart、iic、spi通信总线
  • npm:升级自身时报错:EBADENGINE
  • 微前端架构在前端开发中的实践与挑战
  • 基于微信小程序的校园失物招领系统设计与实现(LW+源码+讲解)
  • 批量修改图片资源的属性。
  • 完全二叉树的节点个数(力扣222)
  • unity 粒子系统设置触发
  • dfs专题五:FloodFill算法