• 62. Unique Paths && 63 Unique Paths II


    https://leetcode.com/problems/unique-paths/

    这道题,不利用动态规划基本上规模变大会运行超时,下面自己写得这段代码,直接暴力破解,只能应付小规模的情形,当23*12时就超时了:

    class Solution {
    public:
    //    Solution():dp1(m,vector<int>(n,-1)),dp2(m,vector<int>(n,-1)){
            
    //    }
        int uniquePaths(int m, int n) {
            helper(1,1,m,n,dp1,dp2);
            return res;
            
        }
        void helper(int row,int col,int m,int n,vector<vector<int>>& dp1,vector<vector<int>>& dp2){
            if(row==m && col==n){
                res++;
                return;
            }
            if(row<m&&col<n){
                helper(row+1,col,m,n,dp1,dp2);
                helper(row,col+1,m,n,dp1,dp2);
            }
            else if(row==m && col<n){
                helper(row,col+1,m,n,dp1,dp2);
            }
            else if(row<m && col==n){
                helper(row+1,col,m,n,dp1,dp2);
            }
        }
        
    private:
        vector<vector<int>> dp1;
        vector<vector<int>> dp2;
        int res;
    };
    View Code

     利用动态规划来做,储存一个二维数组:vector<vector<int>> dp,用来保存每一个位置的走法总数:

    则dp[i][j]=dp[i-1][j]+dp[i][j-1],代码如下:

    class Solution {
    public:
        int uniquePaths(int m, int n) {
            vector<vector<int>> dp(m+1,vector<int>(n+1,-1));
            helper(1,1,m,n,dp);
            return dp[m][n];
        }
        void helper(int row,int col,int m,int n,vector<vector<int>>& dp){
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    if(i==1||1==j)
                        dp[i][j]=1;
                    else{
                        dp[i][j]=dp[i-1][j]+dp[i][j-1];
                    }
                }
            }
        }
    };

    63 Unique Paths II https://leetcode.com/problems/unique-paths-ii/ 

    递归公式仍旧是上一个,不过遇到障碍要作相应处理(置为零)

    class Solution {
    public:
        int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
            int row=obstacleGrid.size();
            int col=obstacleGrid[0].size();
            vector<vector<int>> dp(row,vector<int>(col,-1));
            for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    if(obstacleGrid[i][j]==1){
                        dp[i][j]=0;
                    }
                    else{
                        if(i==0&&0==j){
                            dp[i][j]=1;
                        }
                        else if(0==i && j>0){
                            dp[i][j]=dp[i][j-1];
                        }
                        else if(j==0&& i>0){
                            dp[i][j]=dp[i-1][j];
                        }
                        else{
                            dp[i][j]=dp[i-1][j]+dp[i][j-1];
                        }
                    }
                }
            }
            return dp[row-1][col-1];        
        }
    };
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    域账户-配置文件
    创建任务计划
    查看系统和PowerShell版本
    查找数组中元素的索引位置
    更改计算机名称,修改密码
    生成GUID
    微服务架构 vs. SOA架构
    springMvc架构简介
    Spring Boot和Spring cloud
    Spring链接汇总
  • 原文地址:https://www.cnblogs.com/chess/p/5282511.html
Copyright © 2020-2023  润新知