zoukankan      html  css  js  c++  java
  • LeetCode OJ:Unique Paths(唯一路径)

    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?

    题目的意思就是给你一个m*n网格,求从左上角到右下角的路径条数即可,用dp很容易解决,推到式为res[i][j] = res[i - 1][j] + res[i][j - 1]。意思就是到一个特定点的路径条数是到其左侧或者上侧点的路径条数的总和。

    代码如下:

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         vector<vector<int> > ans(m, vector<int>(n, 0));
     5         for(int i = 0; i < m; ++i)
     6             ans[i][0] = 1;
     7         for(int j = 0; j < n; ++j)
     8             ans[0][j] = 1;
     9 
    10         for(int i = 1; i < m; ++i){
    11             for(int j = 1; j < n; ++j){
    12                 ans[i][j] = ans[i - 1][j] + ans[i][j - 1];
    13             }
    14         }
    15         return ans[m - 1][n - 1];
    16     }
    17 };

    还有一种方法是使用dfs来实现,但是数大了就容易超时,这题的本意可能就是dfs,这里把代码放上:

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         times = 0;
     5         maxHor = m, maxVer = n;
     6         dfs(0,0);
     7         return times;
     8     }
     9     void dfs(int hor, int ver){
    10         if((hor == maxHor - 1) && (ver = maxVer - 1))
    11             times++;
    12         else{
    13             if(hor + 1 < maxHor)  //注意这里不是while
    14                 dfs(hor + 1, ver);
    15             if(ver + 1 < maxVer)
    16                 dfs(hor, ver + 1);
    17         } 
    18     }
    19 private:
    20     int times;
    21     int maxHor;
    22     int maxVer;
    23 };

     java版本如下所示,dp实现:

     1 public class Solution {
     2     public int uniquePaths(int m, int n) {
     3         if(m == 0 || n == 0)
     4             return 0;
     5         int [][] grid = new int [m][n];
     6         for(int i = 0; i < m; ++i){
     7             grid[i][0] = 1;
     8         }
     9         for(int i = 0; i < n; ++i){
    10             grid[0][i] = 1;
    11         }
    12         for(int i = 1; i < m; ++i){
    13             for(int j = 1; j < n; ++j){
    14                 grid[i][j] = grid[i-1][j] + grid[i][j-1];
    15             }
    16         }
    17         return grid[m-1][n-1];
    18     }
    19 }
  • 相关阅读:
    存储过程中执行动态Sql语句
    SqlServer新建视图
    DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件
    oracle number 和sqlserver numeric的区别
    放下你的无效社交
    一个程序员眼中的北京和上海
    10+年程序员总结的20+条经验教训
    SQL collate
    SQL自定义函数split分隔字符串
    C# .NET开发Oracle数据库应用程序
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4901263.html
Copyright © 2011-2022 走看看