分析,这种不能回头算最优解的题,一般考虑用冬天规划来做,记录每一个状态的解
1.当这个网格是单 行 时,肯定是只有一种方式到达终点那就是一直从左向右横着走到头
dp[0][0,1,2,3,....,n-1] = 1;
2.当这个网格是单 列 时,肯定是只有一种方式到达终点那就是一直从上到下竖着走到头
dp[0,1,2,3,....,m-1][0] = 1;
3.
即:下一个格子到达的可能性肯定是上两个格子能到达的可能性相加
即:dp[i][j] = dp[i-1][j] + dp[i][j-1];
public int uniquePaths(int m, int n) {
if(m==n&&m==1) return 1;
int dp[][] = new int[m][n];
//如果网格是横长方,或者竖长方的情况
for(int i = 1; i < m; i++){//竖条的情况
dp[i][0] = 1;
}
for(int i = 1; i < n; i++){//长条的情况
dp[0][i] = 1;
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
此问题还可以理解为递归问题:
static int count = 0;
public static int uniquePaths(int m, int n) {
DFS(m - 1, n - 1);
return count;
}
private static void DFS(int m, int n) {
if (m == 0 && n == 0) {//定义深搜出口
count++;//如果到终点了,就统计路径+1
return;
}
if (m < 0 || n < 0) return;//如果有一个方向越界了,那么就回退
DFS(m - 1, n);//往下走
DFS( m, n - 1);//往右走
}
本题类似题目: