Lintcode 114:Unique Paths
题意:给定m行n列的网格,有一个机器人从左上角(0,0,)出发,每一步可以向下或者向右走一步
求解:有多少种不同的方式走到右下角?
动态规划组成部分一:确定状态
- 最后一步:无论用何种方式走到终点,最后一步一定是
– 向右 或者 向下
子问题
如果机器人有x种方式从左上角走到 (m-2,n-1),有Y种方式从左上角走到(m-1,n-2),则机器人有 X+Y 种方式走到(m-1,n-1),(m-1,n-1)即图中机器人所占位置。
- 问题转换为:有多少种方法从左上角走到 (m-2,n-1) 和 (m-1,n-2)
- 原题要求有多少种方式从左上角走到 (m-1,n-1)
- 子问题
- 状态:设 f [ i ] [ j ] f[i][j] f[i][j]表示有多少种走到 (i,j)
动态规划组成部分二:转移方程
- 对于任意一个格子 (i,j)
f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] f[i][j] = f[i-1][j] + f[i][j-1] f[i][j]=f[i−1][j]+f[i][j−1]
动态规划组成部分三:初始条件和边界情况
- 初始条件: f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1,因为机器人只有一种方式左上角
- 边界情况:i = 0 或者 j = 0,则前一步只能从一个方向过来 f [ i ] [ j ] = 1 f[i][j] = 1 f[i][j]=1
动态规划组成部分四:计算顺序
- f [ 0 ] [ 0 ] = 1 f[0][0] = 1 f[0][0]=1
- 计算第0行:
f [ 0 ] [ 0 ] = 1 , f [ 0 ] [ 1 ] , . . . , f [ 0 ] [ n − 1 ] f[0][0] = 1, f[0][1],...,f[0][n-1] f[0][0]=1,f[0][1],...,f[0][n−1] - 计算第1行:
f [ 1 ] [ 0 ] = 1 , f [ 1 ] [ 1 ] , . . . , f [ 1 ] [ n − 1 ] f[1][0] = 1, f[1][1],...,f[1][n-1] f[1][0]=1,f[1][1],...,f[1][n−1] - …
- 计算第m-1行:
f [ m − 1 ] [ 0 ] = 1 , f [ m − 1 ] [ 1 ] , . . . , f [ m − 1 ] [ n − 1 ] f[m-1][0] = 1, f[m-1][1],...,f[m-1][n-1] f[m−1][0]=1,f[m−1][1],...,f[m−1][n−1]
题解
下面展示 Java代码
。
public calss Solution{
public int uniquePaths( int m, int n){
int [][] f =new int [m][n];
int i, j;
for(i = 0; i < m; ++i){
for(j = 0; j < n ; j++){
if (i == 0 || j== 0){
f[i][j] = 1;
}
else{
f[i][j] = f[m-1][j] + f[i][j-1];
}
}
}
return f[m-1][n-1];
}
}
笔记内容出自视频:https://www.bilibili.com/video/BV1xb411e7ww?from=search&seid=6650948173443064939