DP动态规化快速入门

WU_畏 2024-10-21 16:35:12

动态规划方法论  

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。动态规划,英文: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];
    }
}

 

...全文
39 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,364

社区成员

发帖
与我相关
我的任务
社区描述
柳职院电子信息工程学院同学们的学习园地
社区管理员
  • c_university_1974
  • qq_39231145
  • zhuisir
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

各位加入社区的同学,请完善社区信息,把社区昵称改为【班级-姓名】,社区签名改为【班级-学号-姓名】的格式

如【社区昵称】20计应1班  张某某(班级用简称)

     【社区签名】2020级计算机应用技术1班 20201234567 张某某 (班级用全称)

试试用AI创作助手写篇文章吧