每日一题,简单dp!+dp简单解析
题目链接:剑指 Offer II 098. 路径的数目 - 力扣(LeetCode)
题目信息:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

题目解析:
没有解析
解题方法:简单dp(自底向上)
代码及超详细解析:

class Solution {
public int uniquePaths(int m, int n) {
int[][]dp=new int[m][n];//创建一张地图,存储走到每块区域的步数
for(int i=0;i<n;i++)dp[0][i]=1;//第一行只有一种方式到达
for(int j=0;j<m;j++)dp[j][0]=1;//第一列只有一种方式到达
for(int x=1;x<n;x++)//遍历每一列
{
for(int y=1;y<m;y++)//遍历每一行
{
dp[y][x]=dp[y-1][x]+dp[y][x-1];//当前区域步数等于上方一块+左方一块步数之和
}
}
return dp[m-1][n-1];//返回(m,n)块区域的步数
}
}
动态规划:
动态规划常用来解决最优化问题,这类问题常常有很多可行解,且最优解通常也不止一个
适用动态规划求解最优化问题应该具备:最优子结构+子问题重叠
最优子结构:(贪心同样适用,此处不说明贪心与dp的区别)
一个问题的最优解包含其子问题的最优解
子问题重叠:
即问题的递归算法会反复求解相同的子问题,而不是一直生成新的子问题;
例如本题中:若采用自顶向下(递归)求解:要求(2,2)位置的步数,需要求
(2,1)、(1,2)
(1,1)、(2,0)、(0,2)、(1,1)、
(0,1)、(1,0)、(1,0)、(0,1)、(0,1)、(0,1)
(0,0)、(0,0)、(0,0)、(0,0)、(0,0)、(0,0)
可以看出,求解(1,1)时把(0,1)、(1,0)、(0,0)求解一次,(2,2)时再求解一次。
一般采用自底向上的方式求解,若要采用自顶向下方法,则需要带备忘的形式把求解过的子问题的解存储下来【带备忘的自顶向下法】,不然将会计算大量重复问题。
涉及动态规划算法4步骤:
刻画最优解结构特征
递归地定义最优解的值
计算最优解的值,通常采用自底向上的方法
利用计算出的值构造最优解
1~3是动态规划求解问题的基础,若只需一个最优解值,可忽略第4步