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

●day 35 动态规划part01

第九章 动态规划part01
动态规划的类别

在这里插入图片描述

理论基础
动态规划下五步曲:

1、确定dp数组(dp table)以及下标的含义
2、确定递推公式
3、dp数组如何初始化
4、确定遍历顺序
5、打印dp数组

代码随想录

  1. 斐波那契数

代码随想录
动态规划5部曲

class Solution {
public:int fib(int N) {if (N <= 1) return N;vector<int> dp(N + 1);dp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[N];}
};

状态压缩
dp[0] = dp[1]
dp[1] = sum

class Solution {
public:int fib(int N) {if (N <= 1) return N;int dp[2];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];}
};

递归法

class Solution {
public:int fib(int N) {if (N < 2) return N;return fib(N - 1) + fib(N - 2);}
};
  1. 爬楼梯

代码随想录
注意为了数组的索引是从0,开始的,所以长度还是n+1,dp[0]没有使用

// 版本一
class Solution {
public:int climbStairs(int n) {if (n <= 1) return n; // 因为下面直接对dp[2]操作了,防止空指针vector<int> dp(n + 1);dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) { // 注意i是从3开始的dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};

状态压缩

// 版本二
class Solution {
public:int climbStairs(int n) {if (n <= 1) return n;int dp[3];dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {int sum = dp[1] + dp[2];dp[1] = dp[2];dp[2] = sum;}return dp[2];}
};
  1. 使用最小花费爬楼梯

代码随想录
注意可以从0或者1开始。爬的时候才开始消耗体力值。
所以dp0 = 0;dp1 = 0

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {vector<int> dp(cost.size() + 1);dp[0] = 0; // 默认第一步都是不花费体力的dp[1] = 0;for (int i = 2; i <= cost.size(); i++) {dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.size()];}
};

状态压缩

// 版本二
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int dp0 = 0;int dp1 = 0;for (int i = 2; i <= cost.size(); i++) {int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);dp0 = dp1; // 记录一下前两位dp1 = dpi;}return dp1;}
};
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int dp[2];dp[0] = 0;dp[1] = 0;for(int i = 2; i <= cost.size(); i++){int mincost = min(dp[1]+cost[i-1],dp[0] + cost[i-2]);dp[0] = dp[1];dp[1] = mincost;}return dp[1];}

注意mincost不要写成dp!!! 可以写成dpn等等

// 版本二
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int dp0 = 0;int dp1 = 0;for (int i = 2; i <= cost.size(); i++) {int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);dp0 = dp1; // 记录一下前两位dp1 = dpi;}return dp1;}
};

http://www.mrgr.cn/news/54076.html

相关文章:

  • HarmonyOS NEXT 应用开发实战(六、组件导航Navigation使用详解)
  • HarmonyOS 开发知识总结
  • ANSYS Workbench纤维混凝土3D
  • 394.字符串解码
  • Python基础语法-列表与元组
  • 分布式数据库环境(HBase分布式数据库)的搭建与配置
  • MySQL知识点_03
  • LeetCode 2379.得到K个黑块的最少涂色次数
  • springboot036海滨体育馆管理系统的设计与实现(论文+源码)_kaic
  • 【进阶OpenCV】 (20) --疲劳检测
  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)
  • 数据结构之单链表
  • 2063:【例1.4】牛吃牧草
  • CSDN Markdown 编辑器语法大全
  • 商​汤​二​面
  • 餐饮店怎么标注地图位置信息?
  • 2062:【例1.3】电影票
  • 48.旋转图像
  • FloodFill 算法(DFS)
  • [C++] C++类和对象 类的初始化列表和静态成员 类型转换/友元/内部类/匿名对象/编译器优化
  • Symbol简单介绍
  • 【电子通识】案例:两个按键同时按下把boot拉低电路如何设计?
  • VIT:论文关键点解读与常见疑问
  • mac安装jdk8
  • Linux——应用软件的生命周期
  • 0x3D service