当前位置: 首页 > 知识库问答 >
问题:

使用动态规划计算网格中的路径数?

姬捷
2023-03-14
bool exist(bool a[][], int i, int j,int N){
        return i>=0 && j >=0 && i < N && j < N;
    }
    int search(bool  a[][], int i, int j,int N){
        if(!exist(a,i,j,N) || a[i][j] == 1)
            return 0; // no path here.
        if(i == N-1 && j == N - 1){
            return 1; // 1 path here.
        }
        a[i][j] = 1; // mark that we have seen this spot here
        int paths = 0; // introduce a counter...
        paths += search(a, i,j+1,N); // add the additional paths as we find them
        paths += search(a, i+1,j,N);
        a[i][j] = 0;
        return paths; // return the number of paths available from this point.
    }

这里的单元格1代表死单元格。有什么方法可以通过使用DFS或动态编程E.T.C来降低时间复杂性吗?

共有1个答案

彭炳
2023-03-14

让我们假设下面的3x3网格,其中网格中的1表示障碍物

[0,0,0]
[0,1,0]
[0,0,0]

本例中唯一路径的数目为2。我们可以使用动态编程的方法来降低时间复杂度,找到唯一的路径,下面是C++中的代码

int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
       int m = obstacleGrid.size();
       int n = obstacleGrid[0].size();

    vector<vector<int> > arr(m,vector<int>(n,0));

    if (obstacleGrid[0][0]==1){return 0;}
    arr[0][0]=1;
    for (int i=1;i<m;i++){
        if (obstacleGrid[i][0]!=1){
            arr[i][0] = arr[i-1][0];
        }
    }
    for (int i=1;i<n;i++){
        if (obstacleGrid[0][i]!=1){
            arr[0][i] = arr[0][i-1];
        }
    }
    for (int i=1;i<m;i++){
        for(int j=1;j<n;j++){
            if (obstacleGrid[i][j]!=1){
                arr[i][j] = arr[i][j-1] + arr[i-1][j];
            }
        }
    }   
    return arr[m-1][n-1];
}
 类似资料:
  • 给定一组非负整数和一个值和,确定给定集合中是否有和等于给定和的子集。 例如: 我实际上用这段代码解决了问题: 然而,现在我想重建所有可能的组合,形成给定的总和。 是可以从我的回忆录矩阵中做到这一点,还是我必须以不同的方式做到这一点?

  • 064. Minimum Path Sum[M] 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only mov

  • 我正在学习bfs/dfs,并试图解决这个问题。有一个n×n的网格。找到在网格中从源单元格移动到目标单元格所需的路径(不一定是最短路径),并返回这些单元格之间的路径。每个网格单元格都有一个值。我们可以一次向四个方向移动一步:上、下、左、右。我们只能移动到具有相等或较小值的相邻单元格。如果没有移动可能到达目标,则返回无。目标在右下角,起点在左上角 下面是我的解决方案,但似乎结果与输出结果混合在一起。任

  • 主要内容:动态规划算法的实际应用动态规划算法解决问题的过程和分治算法类似,也是先将问题拆分成多个简单的小问题,通过逐一解决这些小问题找到整个问题的答案。不同之处在于,分治算法拆分出的小问题之间是相互独立的,而动态规划算法拆分出的小问题之间相互关联,例如要想解决问题 A,必须先解决问题 B 和 C。 《贪心算法》一节中,给大家举过一个例子,假设有 1、7、10 这 3 种面值的纸币,每种纸币使用的数量不限,要求用尽可能少的纸币拼凑

  • 我问了这个问题 求和的方法数S与N个数求和的所有方法从给定集合中求和给定数(允许重复) 不太明白那里的答案, 我写了两种方法来解决一个问题: 用数字N(允许重复)找出求和S的方法数 sum=4,number=1,2,3答案是1111、22、1122、31、13、1212、2112、2212 在一种方法中我使用记忆,而在另一种方法中我不使用。不知怎的,在我的机器中,记忆版本的运行速度比非记忆版本慢得

  • 我目前正在学习动态编程,我无法解决这个问题。有人能给我一个算法吗?:考虑一个有向图G=(V,E),其中每个边都标有一个字母Sigma的字符,我们指定一个特殊的顶点s作为开始顶点,另一个f作为最后顶点。我们说G接受一个字符串a=a1a2。如果有一条从s到f的n条边的路径,其标号拼写为序列a。设计了一个O((V+E)n)动态规划算法来确定a是否被G接受。