引用一下别的大佬写的介绍还有知乎上的十问十答
搞清楚什么是动态规划,和什么时候用动态规划。
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]; }