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

算法入门(七):动态规划 - 基础题目

算法入门(七):动态规划 - 基础题目

  • 动态规划
  • 数学计算类
    • Leetcode 118 - 杨辉三角
    • Leetcode 509 - 斐波那契数
  • 爬楼梯
    • Leetcode 70 - 爬楼梯
    • Leetcode 746 - 使用最小花费爬楼梯
    • Leetcode 3693 - 爬楼梯 Ⅱ

动态规划

动态规划/DP/Dynamic Programming:面对某一有很多重叠子问题的情况,采用动态规划,即每一个状态一定是由上一个状态推导出来的。

数学计算类

Leetcode 118 - 杨辉三角

来试一试HOT100里的简单题。

首先尝试理解这个三角形,第一行、第二行全是1,第三行的非首非尾的元素是通过递推式得来的。
于是每一行可以设置为path并初始化为1,这是外循环;path的第i个 = 上一行的res的第i个和i-1个,这是内循环。

classSolution{public:vector<vector<int>>generate(intnumRows){intn=numRows;vector<vector<int>>res(n);vector<int>path;for(inti=0;i<n;i++){path.resize(i+1,1);for(intj=1;j<i;j++){path[j]=res[i-1][j-1]+res[i-1][j];}res[i]=path;}returnres;}};

可以看到,动态规划所说的:“每一个状态是由上一个状态推导出来的”便在path[j] = res[i - 1][j - 1] + res[i - 1][j];体现出来。

Leetcode 509 - 斐波那契数

Leetcode 509 - 斐波那契数

首先理解递归写法:

classSolution{public:intfib(intn){if(n==0)return0;if(n==1)return1;returnfib(n-1)+fib(n-2);}};

当n=5的时候,求fib(5),需要fib(4)和fib(3),以此类推,文字不便理解,用图表示:

一眼便知,时间复杂度为O(2^n) 。

接下来尝试动态规划,新建一个dp数组,如果是dp(n,0)就是n个元素,也就是从0到n-1。所以需要n+1个元素,即 vector dp(n+1, 0) 。

classSolution{public:intfib(intn){if(n<=1)returnn;vector<int>dp(n+1,0);dp[0]=0;dp[1]=1;for(inti=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}returndp[n];}};

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是:0 1 1 2 3 5 8 13 21 34 55。

爬楼梯

Leetcode 70 - 爬楼梯

Leetcode 70 - 爬楼梯

模仿 Leetcode 509,注意边界条件就可以。

classSolution{public:intclimbStairs(intn){vector<int>dp(n+1,0);if(n<=2){returnn;}dp[1]=1;dp[2]=2;for(inti=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}returndp[n];}};

Leetcode 746 - 使用最小花费爬楼梯

Leetcode 746 - 使用最小花费爬楼梯
这道题相比于Leetcode 70更复杂,传入了cost数组。dp不是由某两个状态相加而来,而是由两个状态比较,取最小得来。

classSolution{public:intminCostClimbingStairs(vector<int>&cost){intn=cost.size();vector<int>dp(n+1);dp[0]=0;dp[1]=0;for(inti=2;i<=n;i++){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}returndp[n];}};

Leetcode 3693 - 爬楼梯 Ⅱ

Leetcode 3693 - 爬楼梯 Ⅱ
非常朴实的写法,完全照搬题意,注意dp和cost的下标的含义。

classSolution{public:intclimbStairs(intn,vector<int>&costs){if(n==0)return0;vector<int>dp(n+1);dp[0]=0;if(n>=1)dp[1]=dp[0]+costs[0]+1;if(n>=2)dp[2]=min(dp[0]+costs[1]+4,dp[1]+costs[1]+1);if(n>=3)dp[3]=min({dp[0]+costs[2]+9,dp[1]+costs[2]+4,dp[2]+costs[2]+1});for(inti=4;i<=n;i++){dp[i]=min({dp[i-3]+costs[i-1]+9,dp[i-2]+costs[i-1]+4,dp[i-1]+costs[i-1]+1});}returndp[n];}};
http://www.cnnetsun.cn/news/3627345.html

相关文章:

  • 如何构建高效的本地图片搜索引擎:ImageSearch深度解析
  • AssetRipper终极指南:5步轻松提取Unity游戏资源,新手也能快速上手
  • Efficient Streaming Language Models with Attention Sinks
  • Beyond Compare 5密钥生成技术深度解析:从RSA算法到逆向工程实战
  • 6. 召回:在知识海洋里捞出最相关的片段
  • 高速ADC JESD204B接口配置与调试实战:以TI ADC12DJ2700为例
  • 解决广色域显示器过饱和问题:novideo_srgb色彩校准终极指南 [特殊字符]
  • 深度解析:如何安全构建Switch大气层虚拟系统与插件生态
  • 语音变压器能做到20Hz到20kHz吗?
  • 如何彻底移除Windows Defender:系统管理员终极指南与性能优化工具
  • 如何利用GitHub Actions实现股票分析系统的7x24小时自动化运行
  • 阿里云ECS上搭建生产级Kubernetes集群实战指南
  • 5大核心功能揭秘:如何用daily_stock_analysis实现零成本AI股票分析
  • React 组件库的 Tree Shaking:按需加载与副作用的工程化治理
  • 如何从视频中提取PPT:面向新手的完整智能提取指南
  • 终极Windows实时语音转文字工具:TMSpeech让你的会议内容一目了然
  • 5大核心技术构建高效抢票自动化系统:从原理到实战的完整指南
  • 华为昇腾系列——使用vllm
  • 坚持成就微光
  • C++类细节梳理之派生和继承
  • 为什么你的提示词改写后效果暴跌?——深度解析语义漂移阈值、意图熵值与可执行性衰减曲线
  • 大学哪些数字营销专业证书值得考
  • 科研新人必备AI文献阅读工具盘点:6款论文总结方案实测对比,组会文献汇报不再慌
  • 连续多年展现统治力,「IM 一哥」融云的通关密码
  • 「Qt Widget中文示例指南」如何实现一个日历?(三)
  • 端到端智驾算法:文章导航页
  • 2026工程水利设计公司测评:水土保持工程施工监理十大选型盘点
  • 【工控选型破局】拒绝盲目溢价与低质陷阱:基于 Modbus-RTU 状态诊断与自适应滑动中值滤波的 C++ 实战,兼论“性价比高又好用的仪器仪表厂家”选型之道
  • Internet Download Manager 6.43 Build 7 完全激活版
  • CTF-NetA终极指南:如何用智能流量分析工具破解CTF中的加密谜题