C ++返回最少许多递归调用的最佳方法

Posted

技术标签:

【中文标题】C ++返回最少许多递归调用的最佳方法【英文标题】:C++ best way to return minimum of many recursive calls 【发布时间】:2019-12-11 06:17:52 【问题描述】:

我正在尝试通过递归调用解决动态编程问题。 dp[i][j] 应等于dp[i-1][j], dp[i-1][j-1], dp[i-1][j+1] 的最小值。但我只能对 2 个变量或一个向量使用 c++ 最小函数。我不想把我的结果推到一个向量上,所以我问我能解决这个问题的最好方法是什么。这是代码

int dpF(vector<vector<int>>& A, vector<vector<int>>dp,int i,int j)
    
        if(i<0||i>=A.size()||j<0||j>A.size())
            return 0;
        if(dp[i][j]!=-1)
        
            return dp[i][j];
        

        dp[i][j]=A[i][j]+Math.min(dpF(A,dp,i-1,j-1),dpF(A,dp,i-1,j),dpF(A,dp,i-1,j+1)); //Here is the problem, I am trying to find an elegant way to return the minimum of these 3 values.
        return dp[i][j];
    

【问题讨论】:

简单嵌套min(min(a,b),min(c,d))有什么问题吗? 【参考方案1】:

std::min 提供了一个接受std::initializer_list 的重载。你可以这样做:

std::min(dpF(A,dp,i-1,j-1), dpF(A,dp,i-1,j), dpF(A,dp,i-1,j+1))

【讨论】:

谢谢这是一个很好的答案,但我认为visual studio 2012编译器不支持initializer_list,还有其他方法吗? 您可以编写自己的函数来接受 3 个参数。或者使用 C 风格的数组和std::min_element【参考方案2】:

你可以做 min(dpF(A,dp,i-1,j-1),min(dpF(A,dp,i-1,j),dpF(A,dp,i-1,j+ 1));

【讨论】:

欢迎来到***。为了改进这个答案,您是否可以对其进行编辑以包含对您的解决方案的简要描述,并将code formatting 用于您的代码 sn-ps?

以上是关于C ++返回最少许多递归调用的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

讲一下c语言中递归函数的使用方法有哪些?

浅谈递归调用的个人领悟

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

Algorithm_01--C#递归算法02

递归算法

数据结构和算法——递归算法