【动态规划】—— 路径问题

文章目录:

1. 动态规划基本步骤

2. 路径问题模型例题

2.1:不同路径

2.1.1:算法原理

2.1.2:代码实现

2.2:不同路径 2

2.2.1:算法原理

2.2.2:代码实现

2.3:礼物的最大价值

2.3.1:算法原理

2.3.2:代码实现

2.4:下降路径最小和

2.4.1:算法原理

2.4.2:代码实现

2.5:最小路径和

2.5.1:算法原理

2.5.2:代码实现

2.6:地下城游戏

2.6.1:算法原理

2.6.2:代码实现


今天我们开始动态规划例题的第二个模型——路径问题

叠甲叠甲叠甲:今天的题目全部取自力扣!!!

在开始之前,我们重新回忆一下动态规划的基本步骤

1. 动态规划基本步骤

        1. 状态表示:

                a. 创建一个dp表(通常是一个数组)

                b. 填满dp表,dp表的每一个值就是一个状态

                c. 定义状态表示的方法:

                        i. 题目要求

                        ii. 经验 + 题目要求:

                                1)以某一个位置作为起始

                                2)以某一个位置作为结束

                        iii. 分析问题的过程中,发现了重复子问题

        2. 状态转移方程:根据状态表示得出状态转移方程

                用之前或之后的状态推导出当前状态的值

                通常:根据最近的一步来划分问题

        3. 初始化:保证填表的时候不发生越界

                只需要初始化可能发生越界的状态

        4. 填表顺序:根据状态转移方程和边界条件,确定子问题的求解顺序

                通常是从下到上、从左到右(或称为从小到大)地计算状态值。

        5. 返回值

2. 路径问题模型例题

2.1:不同路径

2.1.1:算法原理

        1. 状态表示:

                a. 创建一个dp表(本题是一个二维数组)

                        i. 经验 + 题目要求:

                                1)以某一个位置作为结束

                                         dp[i][j]表示走到(i,j)位置的时候一共有多少方式

        2. 状态转移方程:

               dp[i][j]:

                        从上面来:(i-1,j)——> (i,j) :dp[i-1][j] 

                        从左面来:(i,j-1)——> (i,j) :dp[i][j-1] 

                状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1] 

        3. 初始化:

                本题:填写一个状态时,会用到上面和左面的节点,最上一行和最左一列会发生越界

                使用虚拟节点法:

                

                       虚拟节点的注意事项:

                        a. 虚拟节点的值要保证后续填表的结果是正确的

                                本题需要保证dp[1][1]=1,而dp[1][1] = dp[0][1] + dp[1][0]

                                需要将dp[0[1] or dp[1][0]初始化为1

                                

                        b. 注意下标的映射:

                        上文的dp[1][1]其实就是原始数组的(0,0)位置

        4. 填表顺序:

                从上到下、从左到右

        5. 返回值:dp[m][n]

2.1.2:代码实现

    //不同路径问题
    public int uniquePaths(int m, int n) {
        // 创建dp表
        //初始化
        //填表
        //返回值

     
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值