引用一下别的大佬写的介绍还有知乎上的十问十答

搞清楚什么是动态规划,和什么时候用动态规划。

p.s.百度百科和算法数上那一大堆看完也没什么意思,不如从实例入手。掌握分析递推关系才是王道。

 集合存储状态+状态转移方程

超级楼梯

共两种爬楼方式——一次上一个台阶&一次上两个台阶,问上到第n阶台阶的方法共多少种。

设状态dp[i]为上i阶台阶的方法种数,dp[1]=1;dp[2]=1;
状态转移方程 dp[i]=dp[i-1]+dp[i-2];//上一阶和两阶

有了该递推式,我们就不用递归暴力解决了。(递归开销是真的大

不同路径

dp[i][j]为到单元格(i,j)的方法数,dp[0][]=1;dp[][0]=1;
dp[i][j]=dp[i-1][j]+dp[i][j-1];//向下走和向右走

  

    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 || j == 0)
                    dp[i][j] = 1;
                else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[m - 1][n - 1];        
    }

 进阶:不同路径 II

    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int row=obstacleGrid.length;
        int col=obstacleGrid[0].length;
        int[][] dp=new int[row][col];
        if(obstacleGrid[0][0]==1){ 
            return 0;
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(obstacleGrid[i][j]==0){
                    if(i==0&&j==0){ 
                        dp[i][j]=1;
                    }else if(i==0){
                        dp[i][j]=dp[i][j-1];
                    }else if(j==0){
                        dp[i][j]=dp[i-1][j];
                    }else{                       
                        dp[i][j]=dp[i-1][j]+dp[i][j-1];
                    }
                }else{
                    dp[i][j]=0;  
                    continue;
                }
            }            
        }  
        return dp[row-1][col-1];
    }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-30
  • 2021-08-27
  • 2021-12-08
猜你喜欢
  • 2021-05-04
  • 2021-03-26
  • 2021-04-20
  • 2021-09-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案