114. 不同的路径(dp动态规划)

114. 不同的路径

中文English

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

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

问有多少条不同的路径?

样例

Example 1:

Input: n = 1, m = 3
Output: 1	
Explanation: Only one path to target position.

Example 2:

Input:  n = 3, m = 3
Output: 6	
Explanation:
	D : Down
	R : Right
	1) DDRR
	2) DRDR
	3) DRRD
	4) RRDD
	5) RDRD
	6) RDDR

注意事项

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

输入测试数据 (每行一个参数)如何理解测试数据?
 
'''
1.确定状态 f[m-1][n-1] 最终状态 
最后一步:最后一步的前一步一定是在f[m-2][n-1] 或者f[m-1][n-2]
子问题:可以转换为到前一步的次数
状态: 设f[i][j]为机器人有多少种方式从左上角走到(i,j)

2.转移方程:f[i][j] = f[i-1][j] + f[i][j-1] 
也就是说到[i][j]位置的方法总数 = 到[i-1][j] + 到[i][j-1]的方法总数,因为他的前一步一定在这两个位置,两个可能次数和

3.初始条件和边界情况
初始条件:f[0][0] = 1
边界情况:移动到m-1和n-1为止
以及如果是i=0或者j=0的时候,次数只能为1,f[0][j] = 1 或者 f[i][0] = 1 >>因为机器人只能是向下或者向右,所以只有一种走的可能

4.计算顺序
f[0][0] = 1
第0行:f[0][0],f[0][1]...f[0][n-1]
...
第m行:f[m-1][0],f[m-1][1]...f[m-1][n-1]
'''
 
动态规划版本:lintcode通过
class Solution:
    """
    @param m: positive integer (1 <= m <= 100)
    @param n: positive integer (1 <= n <= 100)
    @return: An integer
    """
    def uniquePaths(self, m, n):
        # write your code here
        #动态规划dp
        #初始条件
        res = []
        for x in range(m):
            res.append([0]*n)
        
        for i in range(m):
            for j in range(n):
                ##初始边界,初始条件res[0][0]也放在了这里
                if i == 0 or j == 0:
                    res[i][j] = 1 
                    continue
                res[i][j] = res[i-1][j] + res[i][j-1]
        
        return res[m-1][n-1]
                
        

 

posted @ 2020-05-23 23:50  风不再来  阅读(308)  评论(0编辑  收藏  举报