【问题标题】:Count all possible paths from top left to bottom right of a mXn matrix计算 mXn 矩阵从左上角到右下角的所有可能路径
【发布时间】:2021-05-03 01:32:17
【问题描述】:

我应该在 n*m 矩阵中返回从左上角到右下角的可能路径数。 这是我的代码。

class Solution {
 public:
 map<pair<int,int>,long long int>mp;
   long long int numberOfPaths(int m, int n){
       if(n==1 || m==1)
       {
           return 1;
       }
       if(mp[make_pair(n,m)]!=0)
       return mp[make_pair(n,m)];
       mp[make_pair(n,m)]=numberOfPaths(n-1,m)+numberOfPaths(n,m-1);
       return mp[make_pair(n,m)];
   }
};

我有很多解决这个问题的方法,但我有兴趣找出我的代码中的问题。 输入 19 和 71 我得到了错误的答案。

【问题讨论】:

  • 请不要发布截图,尤其是那些没有添加有用信息的截图。您的解决方案使用蛮力递归,这在实践中经常失败。用铅笔和纸来解决这个问题,你很快就会看到一个更快的算法。
  • 预期的答案是什么?您的程序返回了什么?
  • 对于输入 19 和 71 。预期输出:809936179 和我的代码输出:2418561960739869780
  • @doddi-girish 请参阅下面的答案。对于问题陈述,您的预期输出是错误的。如果对您有帮助并回答了问题,请将其标记为答案。
  • @Doddigirish 您没有看到输出中提到的模数条件吗?如果有,为什么不在问题中提及?

标签: c++ algorithm dynamic-programming


【解决方案1】:

简答:您的预期答案是错误的。输入 19 和 71 的正确答案确实是 2418561960739869780。

长答案:

首先,始终保持代码格式 - 它可以帮助您自己和此类问题的读者收集一些阅读问题的动力。这是一个格式稍微好一点的版本:

class Solution {
public:
    map<pair<int, int>, long long int> mp;
    long long int numberOfPaths(int m, int n) {
        if(n == 1 || m == 1) {
            return 1;
        }
        if(mp[make_pair(n, m)] != 0) return mp[make_pair(n, m)];
        mp[make_pair(n, m)] = numberOfPaths(n-1, m) + numberOfPaths(n, m-1);
        return mp[make_pair(n, m)];
    }
};

其次,始终尝试包含可重现的代码。当您只共享一个类定义时,读者将很难理解您是如何使用它的。

第三,我知道您这样做是作为动态编程的一部分。但是这种方法是蛮力的(正如之前的评论中所指出的那样)。对此的数学解决方案是(m-1) + (n-1) C (m-1),因为您有尽可能多的组合。由于优化了乘法而不是重复加法,因此计算速度也更快。

88 C 18 确实是 2418561960739869780。

【讨论】:

    【解决方案2】:

    我认为你在这里错过了 Mod 10^9 + 7 的东西,仔细阅读问题,为了避免溢出,你必须使用 ans mod 10^9 +7

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多