链接:
https://leetcode.com/problems/unique-paths/
大意:
给定一个二维数组的大小m*n,要求从起点(左上角)走到终点(右下角)有多少种方案。规定:每次移动只能向右移动一格或者向下移动一格。例子:
思路:
动态规划。到达某点 i,j 的方案数为 到达该点的上面一点 i-1,j的方案数+ 到达该点左边一点 i,j-1 的方案数 。动态规划递推公式找到了,接下来就是写代码实现。(注意下构造动态规划数组的小技巧)
代码:
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m + 1][n + 1]; // 分配数组为 [m+1][n+1]可以方便解决数组越界的判断
dp[1][1] = 1; // 初始化dp[1][1] 也就是起点到起点的的方案数为1
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (i != 1 || j != 1)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // 到达每一个点的方案数为由到上面点的方案数+到左边点的方案数
}
}
return dp[m][n];
}
}
结果:
结论:
动态规划,首先想想状态怎么转移,找出递推公式。