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

leetcode 2944.购买水果需要的最小金币

思路:dp

这道题一开始想的时候并不会,但是看到了有些水果可以买也可以不买,所以就想到了选择与不选择的思路。

对于每一个水果,我们都有买和不买的选择,但是我们的第一个水果是一定要买的。然后再往后推导。

用dp[][2]来表示这个状态方程。dp[i][1]表示的就是选择买第i个水果,另外一个状态就是不买了。

但是大家也发现了,不买水果的话,我们还需要知道的一点就是前面是否有买过水果能让当前这个水果不用买呢?这是这道题的核心问题。既然不买,那么肯定就必须是前面买过的水果里有覆盖这个水果的。

这怎么办呢?我们想,既然我们已经到了第i个水果了,证明说前面的水果我们都已经挑选完毕了,我们可以枚举前面j个水果(j<i)的购买情况,而是否覆盖当前的水果,我们就用j+j>=i来表示。为什么呢?第一个j代表我们已经买到当前的水果j了,然后这个水果又可以往后覆盖j个水果让他免费。并且这个>=i是包含我们当前水果的判断。

dp[i][0]=min(dp[i][0],dp[j][1])这就是不选择买当前水果的方程。

好了,我解决最棘手的问题之后,剩下的就好解决了,选择买这个水果那么方程就是:

dp[i][1]=min(dp[i-1][0],dp[i-1][1])+prices[i-1](这里i是从2开始的)

上代码:

class Solution {
public:int minimumCoins(vector<int>& prices) {int n=prices.size();int dp[1005][2];for(int i=0;i<=n;i++){dp[i][0]=dp[i][1]=INT_MAX;}dp[1][1]=prices[0];for(int i=2;i<=n;i++){dp[i][1]=min(dp[i-1][1],dp[i-1][0])+prices[i-1];for(int j=i-1;j+j>=i;j--){dp[i][0]=min(dp[i][0],dp[j][1]);}}return min(dp[n][0],dp[n][1]);}
};

http://www.lryc.cn/news/343558.html

相关文章:

  • 算法人生(14):从“探索平衡策略”看“生活工作的平衡之道”
  • 如何使用Tushare+ Backtrader进行股票量化策略回测
  • Guid转换为字符串
  • OpenAI的搜索引擎要来了!
  • PaddlePaddle与OpenMMLab
  • HBuilderX uniapp+vue3+vite axios封装
  • 【网络安全产品】---应用防火墙(WAF)
  • C++学习第十二天(继承)
  • WPF DataGrid绑定后端 在AutoGeneratingColumn事件中改变列名
  • 2024 CorelDraw最新图形设计软件 激活安装教程来了
  • 双网口扩展IO支持8DO输出
  • 【负载均衡在线OJ项目日记】编译与日志功能开发
  • yaml配置文件的在深度学习中的简单应用
  • spring boot 核心配置文件是什么?
  • Python的奇妙之旅——回顾其历史
  • Flink面试整理-Flink的性能优化策略
  • SpringBoot与SpringMVC的区别
  • 漏洞挖掘之某厂商OAuth2.0认证缺陷
  • 电脑屏幕监控软件都有哪些 | 五大好用屏幕监控软件盘点
  • 数据结构-线性表-链表-2.3-2
  • 【自动化测试】使用MeterSphere进行接口测试
  • C语言 main( ) 函数的指针数组形参是怎么回事?
  • 汽车 - 什么是车轮抱死
  • 环保设备统一管理系统
  • python 11Pandas数据可视化实验
  • 【JUC】并发编程 AQS,ReentryLock,CyclicBarrier,CountDownLatch 原理总结
  • 移动端底层事件(如左滑返回事件)在同一个路由下不同页面需要不同的处理要怎样才能做到统一处理?
  • hive中开窗函数row_number的使用
  • 华为数据之道第三部分导读
  • 【Qt】常用控件(一)