• 领扣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;
    		 
    	 }

    【总结】

    动态规划的边界是弱点

     
  • 相关阅读:
    face_recognition人脸识别框架
    POJ 3260 The Fewest Coins(多重背包问题, 找零问题, 二次DP)
    POJ 2392 Space Elevator(多重背包变形)
    POJ 1014 Dividing(多重背包, 倍增优化)
    POJ 1384 Piggy-Bank(完全背包)
    POJ 2063 Investment(完全背包)
    POJ 3211 Washing Cloths(01背包变形)
    POJ 1837 Balance(01背包变形, 枚举DP)
    POJ 2923 Relocation(01背包变形, 状态压缩DP)
    POJ 1243 One Person
  • 原文地址:https://www.cnblogs.com/xiaoming521/p/15058449.html
Copyright © 2020-2023  润新知