DP动态规化快速入门

WU_畏 WU_畏 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

动态规划方法论  

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的(这也就是为什么它是“动态”),这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,动规和递归的区别是动规不是暴力的,产生的中间结果用数组记录起来(“规划”),比较高效,


动态规划解题

  1. 确定DP数组,以及其下标的含义
  2. 确定递推公式
  3. dp数组的如何初始化
  4. 确定遍历顺序
  5. 举列推导dp数组

一维数组 

电梯问题 

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

class Solution {
    public int climbStairs(int n) {
        if(n<2)
            return 1;
        int[] dp=new int[n+1]; //爬到地i个楼梯有dp[i]种方法

        //初始化dp数组
        dp[1]=1;
        dp[2]=2;

        //确定遍历顺序
        for(int i=3;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];//确定递推公式
        }
        return dp[n];
    }
}

二维数组

不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp=new int[m+1][n+1];//当机器人位于 m,n上时 有dp[m][n]条不同路径
        //初始化dp数组
        for(int i=1;i<=m;i++) {dp[i][1]=1;}
        for(int i=1;i<=n;i++) {dp[1][i]=1;}
        /*
        *确定递归方式
        *当前位置不同路径dp[m][n]等于当前的上一个dp[m-1][n]和左边dp[m][n-1]的和
        **/
        for(int i=2;i<=m;i++){
            for(int j=2;j<=n;j++){
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }
}

 

...全文
评论
收藏 已收藏
分享
返回顶部