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

今日分享 动态规划

一、动态规划核心概念

 

动态规划是一种通过拆分问题、存储子问题答案来避免重复计算,从而高效解决多阶段决策问题的算法思想,核心是“备忘录”(存储子问题结果)和“状态转移”(子问题间的推导关系)。

 

1. 适用场景

 

问题可拆分为多个“子问题”,且子问题结果会重复使用(重叠子问题)。

问题的最优解可由子问题的最优解推导得出(最优子结构)。

 

2. 解题步骤

 

1. 定义状态:用 dp[i] 或 dp[i][j] 表示“到第i步/第i,j个位置的最优解/结果”,明确状态含义是关键。

2. 推导状态转移方程:确定 dp[i] 与 dp[i-1] 、 dp[i-2] 等前序状态的关系(核心公式)。

3. 初始化状态:给最基础的子问题(如 dp[0] 、 dp[1] )赋值,作为推导起点。

4. 计算最终结果:按顺序(从基础子问题到目标问题)计算,得到最终答案。

 

二、例题:爬楼梯

 

题目描述

 

假设你正在爬楼梯,需要 n 阶才能到达楼顶。每次可以爬1或2个台阶,有多少种不同的方法可以爬到楼顶?

 

问题分析

 

状态定义: dp[i] 表示“爬到第i阶台阶的不同方法数”。

状态转移方程:要到第 i 阶,前一步只能是“从第i-1阶爬1阶”或“从第i-2阶爬2阶”,因此 dp[i] = dp[i-1] + dp[i-2] 。

初始化:

dp[1] = 1 (1阶台阶只有1种方法:爬1阶)。

dp[2] = 2 (2阶台阶有2种方法:1+1或2)。

最终结果: dp[n] 。

 

三、多语言实现

 

1. C语言实现

 

 

#include <stdio.h>

 

int climbStairs(int n) {

    // 优化空间:无需数组,用两个变量存储前两个状态

    if (n == 1) return 1;

    if (n == 2) return 2;

    int prev_prev = 1; // dp[i-2]

    int prev = 2; // dp[i-1]

    int curr; // dp[i]

    for (int i = 3; i <= n; i++) {

        curr = prev_prev + prev;

        prev_prev = prev;

        prev = curr;

    }

    return prev;

}

 

int main() {

    int n = 5;

    printf("爬%d阶楼梯的方法数:%d\n", n, climbStairs(n)); // 输出8

    return 0;

}

 

 

2. C++语言实现

 

 

#include <iostream>

using namespace std;

 

int climbStairs(int n) {

    if (n <= 2) return n;

    int dp_prev2 = 1, dp_prev1 = 2, dp_curr;

    for (int i = 3; i <= n; ++i) {

        dp_curr = dp_prev2 + dp_prev1;

        dp_prev2 = dp_prev1;

        dp_prev1 = dp_curr;

    }

    return dp_prev1;

}

 

int main() {

    int n;

    cout << "请输入台阶数n:";

    cin >> n;

    cout << "方法数:" << climbStairs(n) << endl;

    return 0;

}

 

 

3. Python语言实现

 

 

def climb_stairs(n):

    if n <= 2:

        return n

    # 初始化前两个状态

    prev_prev, prev = 1, 2

    for _ in range(3, n + 1):

        curr = prev_prev + prev

        prev_prev, prev = prev, curr

    return prev

 

# 测试

n = 5

print(f"爬{n}阶楼梯的方法数:{climb_stairs(n)}") # 输出8

 

 

4. Java语言实现

 

 

import java.util.Scanner;

 

public class ClimbStairs {

    public static int climbStairs(int n) {

        if (n == 1) return 1;

        if (n == 2) return 2;

        int dpPrev2 = 1; // dp[i-2]

        int dpPrev1 = 2; // dp[i-1]

        int dpCurr = 0;

        for (int i = 3; i <= n; i++) {

            dpCurr = dpPrev2 + dpPrev1;

            dpPrev2 = dpPrev1;

            dpPrev1 = dpCurr;

        }

        return dpCurr;

    }

 

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入台阶数n:");

        int n = scanner.nextInt();

        System.out.println("方法数:" + climbStairs(n));

        scanner.close();

    }

}

 

 

四、代码说明

 

所有实现均采用空间优化:原本需用长度为 n 的数组存储 dp ,但因 dp[i] 仅依赖 dp[i-1] 和 dp[i-2] ,故用两个变量替代数组,空间复杂度从 O(n) 降至 O(1) ,时间复杂度均为 O(n) (仅需遍历1次从3到n的台阶)。


文章转载自:

http://6IgGhTcz.qymqh.cn
http://zSjY3DFv.qymqh.cn
http://Y8VYK5eY.qymqh.cn
http://VEeTfui3.qymqh.cn
http://10WD9Ox3.qymqh.cn
http://OxmHL6Sn.qymqh.cn
http://5QugOfsH.qymqh.cn
http://XSeB1g05.qymqh.cn
http://mtYes1Wt.qymqh.cn
http://TvAtRisZ.qymqh.cn
http://ucrq0n1f.qymqh.cn
http://fdOIYIvD.qymqh.cn
http://RAz7QgUp.qymqh.cn
http://UWAY6Fcl.qymqh.cn
http://3CFnahU9.qymqh.cn
http://M3jizc7M.qymqh.cn
http://4rmjQHux.qymqh.cn
http://M9pqZCPa.qymqh.cn
http://dU9nl2ZF.qymqh.cn
http://7wZ0wYf1.qymqh.cn
http://1i4fjn1T.qymqh.cn
http://gFOeSS4E.qymqh.cn
http://QL7po0bT.qymqh.cn
http://8617TBBj.qymqh.cn
http://g6XWdi2p.qymqh.cn
http://yKbcKGRO.qymqh.cn
http://Mqq5e7ga.qymqh.cn
http://osmR9bYa.qymqh.cn
http://EF9VBRd0.qymqh.cn
http://0FJcYjev.qymqh.cn
http://www.dtcms.com/a/383375.html

相关文章:

  • count down 96 days
  • KingbaseES客户端工具Ksql使用全指南:从安装到高级操作
  • 海狸笔记:一款注重隐私和效率的开源笔记软件
  • 自学C语言是推荐照着课本或实体书来还是照着网上找的课来?
  • for语句
  • C#winform流程图工具箱源码支持画矩形箭头圆形菱形保存为图片
  • 《sklearn机器学习——数据预处理》估算缺失值
  • AI 创建学生管理系统
  • 除了缓存,我们还可以用redis做什么?
  • SSRF服务器端请求伪造
  • Spring事务注解@Transactional核心机制详解
  • [问题记录]刚下载的Qt,跑项目出现的问题
  • ACP笔记(二):大模型的问答工作流程及影响大模型内容生成的随机生成参数
  • 安卓学习 之 Activity的生明周期
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘pandas’ 问题
  • SPSS绘制ROC曲线并计算灵敏度、特异度
  • 健康的饮食习惯是什么样的
  • [Windows] 电脑清理软件 AppCleaner v3.3.6626.24371
  • Git版本控制工具+基础命令
  • 通用引用与重载的困境:Effective Modern C++ 条款27的技术总结
  • [数据结构总结篇]--线性表
  • 【Javaweb学习|实训总结|Week2】个人疑问记录、大模型API接入
  • srm招标采购询价供应商管理系统源码(java源码➕vue前端➕数据库操作文档➕软件文档)
  • 蚂蚁S19 Pro Hyd 184T矿机参数分析及其特点
  • Coze源码分析-资源库-创建知识库-基础设施/存储/安全
  • 国家标准项目管理专业人员五级划分解析
  • c++---map和set
  • Python可微分编程革命:JAX与PyTorch2.0的梯度计算架构剖析
  • 【Linux】人事档案——用户及组管理
  • JavaScript对象创建方式完全指南:从原始到现代的演进之路