C++笔试练习笔记【5】:最小花费爬楼梯(有题目链接) 初识动态规划

文章目录

题目

题目链接:https://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e?tpld=230\&tpld=39751\&ru=/exam/oj

思路

有几个细节要明确

  • const[i]是在离开时花费的体力所以在离开时才会加
  • 根据例子我们能知道数组给了i个数我们下标到达i才算到顶,如图如果我们必须到达cost[i+1]才算登顶

动态规划:

  1. 状态表示:
    dp[i]:到达i位置所用最小花费
  2. 状态转移方程

    因为一次只能向上一个台阶或者两个台阶所以只有i-1,i-2两种可能。
cpp 复制代码
	dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);

代码

cpp 复制代码
#include <iostream>
using namespace std;

#define N 100010

int main() {
    int cost[N]={0};
    int dp[N]={0};
    int n;

    cin >> n;
    for(int i=0;i<n;i++)
        cin >> cost[i];
    
    for(int i=2;i<=n;i++)
        dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
    
    cout << dp[n] << endl;
    return 0;
}

动态规划简介

一、什么是动态规划

动态规划(Dynamic Programming)是一种在解决多阶段决策问题时常用的算法思想。它通过将复杂问题分解成一系列相互关联的子问题,并按照一定的顺序求解这些子问题,从而避免了重复计算,提高了算法的效率。上面的题的思想就是动态规划。

动态规划的核心思想是"最优子结构"和"重叠子问题"。最优子结构意味着一个问题的最优解包含了其子问题的最优解。重叠子问题则是指在求解过程中,相同的子问题会被多次计算。

二、动态规划的应用场景

动态规划在许多领域都有广泛的应用,例如:

  1. 求解最短路问题,如在图中找到从一个节点到另一个节点的最短路径。
    • 例如,在一个城市交通网络中,寻找从起点到终点的最短行驶路线。
  2. 资源分配问题,如何合理分配有限的资源以达到最优效果。
    • 比如在项目管理中,合理分配人力和时间资源,以使项目能够在最短时间内完成。
  3. 背包问题,给定一组物品和一个背包容量,选择哪些物品放入背包能使价值最大化。

三、动态规划的基本步骤

  1. 定义状态表示:明确问题中的状态变量,这些变量通常用来描述子问题的解。
  2. 建立状态转移方程:找出不同状态之间的关系,确定如何从一个状态转移到另一个状态。
  3. 初始化边界条件:确定初始状态的值。
  4. 按照合适的顺序计算状态值:通常是从边界条件开始,逐步计算其他状态的值。

四、动态规划的优缺点

优点:

  1. 能够有效地降低算法的时间复杂度,避免重复计算。
  2. 对于具有最优子结构和重叠子问题的问题,能够得到最优解。

缺点:

  1. 空间复杂度可能较高,需要存储状态值。
  2. 状态定义和转移方程的推导可能比较困难,需要对问题有深入的理解。

总之,动态规划是一种强大的算法思想,掌握它对于解决许多复杂的优化问题具有重要意义。但在实际应用中,需要根据具体问题的特点来选择是否使用动态规划以及如何设计有效的算法。

相关推荐
智者知已应修善业4 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
奋斗的小乌龟4 小时前
langchain4j笔记-06
笔记
·醉挽清风·4 小时前
学习笔记—MySQL—库表操作
笔记·学习·mysql
weixin_451431566 小时前
【学习笔记】微博视频页面ajax请求与响应数据分析
笔记·学习·音视频
Byron Loong7 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
坚果派·白晓明7 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
快乐得小萝卜7 小时前
OpenVLA 论文精读笔记
笔记
咩咦8 小时前
C++学习笔记02:cin 和 cout 输入输出
c++·学习笔记·cin·输入输出·cout
咩咦8 小时前
C++学习笔记05:引用和常引用
c++·学习笔记·引用·const·常引用
叶~小兮8 小时前
K8S进阶核心综合学习笔记(持久化存储+特殊容器+调度管理)
笔记·学习·kubernetes