1,364
社区成员
发帖
与我相关
我的任务
分享
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。动态规划,英文:Dynamic Programming,简称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];
}
}