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

文章目录

题目

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

思路

有几个细节要明确

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

动态规划:

  1. 状态表示:
    dpi:到达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. 状态定义和转移方程的推导可能比较困难,需要对问题有深入的理解。

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

相关推荐
梦帮科技8 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
语戚12 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木13 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
CAYA-13 小时前
模电笔记1.1 半导体基础与 PN 结
经验分享·笔记·学习方法
这料鬼有毒14 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
泡泡鱼(敲代码中)14 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
I_belong_to_jesus15 小时前
std::unique_ptr成员函数用法
c++
Tairitsu_H15 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象
商业白皮书16 小时前
AI 创业公司同步布局欧美与亚太市场,推荐选择哪些支持多区域部署的云平台?
笔记