领扣114 · 不同的路径

描述

有一个机器人的位于一个 m × nm×n 个网格左上角。

机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。

问有多少条不同的路径?

n和m均不超过100
且答案保证在32位整数可表示范围内。

 

【分析题目】

一个棋子从左上角(0,0)按照从向下或者向右的方向,到达右下角(m,n)

【解题思路】

【动态规划】

【1、确定状态】

1)最后一步一定从左边(i,j-1)过来,或者上边(i-1,j)过来,
2)状态f[i][j]表示从左上角有多少种方式 走到(i,j),
3)坐标型动态规划:数组下标[i][j]即坐标(i,j)
4)化成子问题:状态f(X)=用多少枚硬币能拼出子问题X

【2、状态转移方程】

f[i][j] = f[i][j-1] + f[i-1][j];

【3、初始条件和边界条件】

初始条件:f[i][j] = 0
边界条件:
当i = 0 f[i][j] = 1
当j = 0 f[i][j] = 1
其他 f[i][j] = f[i-1][j] + f[i][j-1];

【4、计算顺序】

从小到大

【代码】

//	public int uniquePaths(int m, int n) {
//		int[][] f = new int[m][n];
//		f[0][0] = 1;
//		for (int i = 0; i < m; i++) {
//			for (int j = 0; j < n; j++) {
//				if (i == 0 && j == 0) {
//					f[i][j] = 1;
//				}
//				if (j - 1 >= 0)
//					f[i][j] += f[i][j - 1];
//				if (i - 1 >= 0)
//					f[i][j] += f[i - 1][j];
//			}
//		}
//		return f[m - 1][n - 1];
}

`

 public int uniquePaths(int m, int n) {
		 if(m == 1 || n == 1)
			 return 1;
		 double row = 1;
		 double col = 1;
		 for(int i = 1;i <= m-1;i++)
			 row *= i;
		 for(int i = n; i <= m+n-2; i++)
			 col *= i;
		 int result = (int)Math.round(col / row);
		 return result;
		 
	 }

【总结】

动态规划的边界是弱点

 
posted @ 2021-07-25 17:51  zhustarstar  阅读(29)  评论(0编辑  收藏  举报