动态规划1

简介: 动态规划1

动态规划问题的五步操作:

动态规划就是把dp表填满,则最终一定有一个数据是我们所需要的数据

下面以一道简单的题目进行讲解

本题其实就是斐波那契数列的一个plus版 ,就是利用递推关系求值的过程

1.前期准备:创建dp表(使用一维数组)

正式过程

1.状态表示

状态表示就是找dp[i]所表示的含义,本体比较简单,根据题目要求我们知道状态表示就是对应的泰波那契数

2.状态转移方程

 状态转移方程就是去找dp[i]与其他状态之间的依赖关系,本题的依赖关系题目直接给出,就是递推公式

3.初始化

 初始化是保证填表时不越界,初始化的根据是状态转移方程,对于本题来说,由于方程中出现了i-1,i-2,i-3,所以i不能等于0,1,2,如果等于就发生了越界,所以先进行初始化,把可能发生越界的位置初始化(本题根据题目要求直接进行初始化)

4.确定填表顺序

 填表顺序是为了保证插入状态时所需要的状态已经被计算过,比如在本题中,如果要在下标为4的地方进行插入,需要保证下标为1,2,3对应的状态已经被计算过。所以本题的填表顺序就是从左往右依次填入

5.填表,返回

 题目要求+状态表示

 题目要求返回第n个泰波那契数,状态表示dp[n]就是 第n个泰波那契数,所以直接返回即可

对于动态规划的题目来说,前两部是最重要的,找到对应的状态表示和状态转移方程是解决动态规划问题的核心

代码实现:

写代码一般分为4步

1.创建dp表

2.初始化(防止越界)

3.填表

4.返回

class Solution {
    public int tribonacci(int n) {
    // 1.创建dp表
    // 2.初始化(防止越界)
    // 3.填表
    // 4.返回
 
    // 处理细节
    if(n == 0) return 0;
    if(n == 1 || n == 2) return 1;
 
    int[] dp = new int[n+1];
    dp[0]=0;dp[1]=dp[2]=1;
    for(int i = 3; i <= n; i++) {
        // 状态转移方程+填表顺序
        dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
    }
    return dp[n];
 
    }
}

时间复杂度:O(N)

空间复杂度:O(N)

优化思路:

 本题的优化可以使用滚动数组来降低空间复杂度至O(1),常用到本类型的题和背包问题

滚动数组的使用条件:当你发现求解某个状态时,只需若干个有限的状态来辅助,此时就可以使用滚动数组

代码实现:

class Solution {
    public int tribonacci(int n) {
    // 1.创建dp表
    // 2.初始化(防止越界)
    // 3.填表
    // 4.返回
 
    // 处理细节
    if(n == 0) return 0;
    if(n == 1 || n == 2) return 1;
 
    int a=0,b=1,c=1,d=0;
    for(int i = 3; i <= n; i++) {
        // 状态转移方程+填表顺序
        d = a+b+c;
        a = b;
        b = c;
        c = d;
    }
    return d;
 
    }
}

02.不同的路径(经典的二维dp问题)

链接:62. 不同路径 - 力扣(LeetCode)

代码:

 

class Solution {
    public int uniquePaths(int m, int n) {
        // 1.准备dp表
        int[][] dp = new int[m + 1][n + 1];
 
        // 2.初始化
        dp[0][1] = 1;
 
        // 3.填表
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        
        return dp[m][n];
    }
}


目录
相关文章
|
存储 监控 固态存储
硬盘对碎片整理的需求
【10月更文挑战第1天】硬盘对碎片整理的需求
311 4
|
SQL 存储 关系型数据库
MySQL not exists 真的不走索引么
MySQL not exists 真的不走索引么
517 0
|
存储 NoSQL BI
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
337 0
|
SQL
若依框架---角色与权限
若依框架---角色与权限
901 0
阿里巴巴发布《城市数字孪生能力平台总体技术要求》企业标准, 促进数字孪生互联互通生态建设
2023年3月21日,阿里巴巴集团举办城市数字孪生企业标准发布及研讨会,发布了《城市数字孪生能力平台总体技术要求》企业标准。
阿里巴巴发布《城市数字孪生能力平台总体技术要求》企业标准, 促进数字孪生互联互通生态建设
|
机器学习/深度学习 vr&ar
深度学习笔记(十):深度学习评估指标
关于深度学习评估指标的全面介绍,涵盖了专业术语解释、一级和二级指标,以及各种深度学习模型的性能评估方法。
584 0
深度学习笔记(十):深度学习评估指标
|
运维 监控 数据可视化
高效运维的秘密武器:自动化工具链的构建与实践在当今数字化时代,IT系统的复杂性和规模不断增加,使得传统的手动运维方式难以应对日益增长的业务需求。因此,构建一套高效的自动化工具链成为现代运维的重要任务。本文将深入探讨如何通过自动化工具链提升IT运维效率,确保系统稳定运行,并实现快速响应和故障恢复。
随着企业IT架构的不断扩展和复杂化,传统的手动运维已无法满足业务需求。自动化工具链的构建成为解决这一问题的关键。本文介绍了自动化工具链的核心概念、常用工具及其选择依据,并通过实际案例展示了自动化工具链在提升运维效率、减少人为错误、优化资源配置等方面的显著效果。从监控系统到自动化运维平台,再到持续集成/持续部署(CI/CD)的流程,我们将一步步揭示如何成功实施自动化工具链,助力企业实现高效、稳定、可靠的IT运维管理。
|
传感器 数据采集 数据挖掘
基于AB32VG1的冬笋探测器设计
基于AB32VG1的冬笋探测器设计利用微波反射法,由发射/接收电路、天线、相位检测模块(如AD8302D)及温湿度补偿单元构成。设备产生900MHz信号,通过土壤时,信号变化由AB32VG1分析并显示在LCD屏幕上。硬件包括AB32VG1主控、ADF4351高频源、温湿度传感器和900M天线。软件利用AB32VG1处理信号并进行探测。项目开源,代码可在Gitee找到。
330 1
|
算法 网络性能优化
网络中窗口的含义及作用
【8月更文挑战第24天】
1487 0