• Leetcode 动态规划 Unique Paths


    本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie


    Unique Paths

     Total Accepted: 17915 Total Submissions: 57061My Submissions

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    How many possible unique paths are there?


    Above is a 3 x 7 grid. How many possible unique paths are there?

    Note: m and n will be at most 100.




    题意:给定一个 m * n 的网格,一个机器人要从左上角走到右下角,每次仅仅能向下或向右移动一个位置。
    问有多少种走法
    思路1:dfs暴力枚举
    复杂度:超时了... O(2^n)

    思路2:记忆化搜索

    用一个数组paths[i][j]记录从 (0,0) 到 (m,n)的路径数

    思路3:dp
    设置状态为f[i][j],表示从(0,0)到达网格(i,j)的路径数,则状态转移方程为
    f[i][j] = f[i - 1][j] + f[i][j - 1]
    复杂度:时间O(n^2) 空间 O(n)

    <pre name="code" class="cpp">//思路1
    int uniquePaths(int m, int n){
    	if(m < 0 || n < 0) return 0;
    	if(m == 1 && n == 1) return 1;
    	return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
    }
    
    //思路2
    //paths[i][j]表示从(0,0)到(i,j)的路径数
    int paths[101][101];
    int dfs(int m, int n){
    	if(m < 0 || n < 0) return 0;
    	if(m == 1 && n == 1) return 1;
    	if(paths[m][n] >= 0) return paths[m][n];
    	return paths[m][n] = dfs(m - 1, n) + dfs(m, n - 1);
    }
    int uniquePaths(int m, int n){
    	memset(paths, -1, sizeof(paths));
    	return dfs(m, n);
    }
    
    //思路2还有一种写法
    //paths[i][j]表示从(i,j)到(m - 1,n - 1)的路径数
    int paths[101][101];
    int mm, nn;
    int dfs(int x, int y){
    	if(x >= mm || y >= nn) return 0;
    	if(x == mm - 1 && y == nn - 1) return 1;
    	if(paths[x][y] >= 0) return paths[x][y];
    	return paths[x][y] = dfs(x + 1, y) + dfs(x, y + 1);
    }
    int uniquePaths(int m, int n){
    	mm = m, nn = n;
    	memset(paths, -1, sizeof(paths));
    	return dfs(0, 0);
    }
    
    //思路3 paths[i][j] 表示(0, 0) 到(i,j)的路径数
    int paths[101][101];
    int uniquePaths(int m, int n){
    	memset(paths, 0, sizeof(paths));
    	for(int i = 0; i < m; ++i) paths[i][0] = 1;
    	for(int j = 0; j < n; ++j) paths[0][j] = 1;
    	for(int i = 1 ; i < m; ++i){
    		for(int j = 1; j < n; ++j){
    			paths[i][j] = paths[i - 1][j] + paths[i][j - 1];
    		}
    	}
    	return paths[m - 1][n - 1];
    }
    思路3 还有一种写法
    用一个一维数组 paths[j] 表示 (0, 0) 至 (i, j)的路径数,在外循环变量为 i 时,还没更新前 
    paths[j] 相应上面二维数组写法的paths[i - 1, j],paths[j - 1]相应paths[i][j - 1]
    int paths[101];
    int uniquePaths(int m, int n){
    	memset(paths, 0, sizeof(paths));
    	paths[0] = 1;
    	for(int i = 0; i < m; ++i){
    		for(int j = 1; j < n; ++j){
    			paths[j] = paths[j] + paths[j - 1];
    		}
    	}
    	return paths[n - 1];
    }


    
    

  • 相关阅读:
    使用docker搭建FastDFS文件系统 + python3 上传测试
    小学四则运算编程实践
    熟悉编程语言
    fibnacci数列递归实现
    2019-2020-1 20191315《信息安全专业导论》第七周学习总结
    2019-2020-1 20191315《信息安全专业导论》第六周学习总结
    2019-2020-1 20191315 《信息安全专业导论》第五周学习总结
    2019
    2019-2020-1 20191315《信息安全专业导论》第三周学习总结
    师生关系
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5183424.html
Copyright © 2020-2023  润新知