【问题标题】:Translate this code from recursive to iterative DP将此代码从递归转换为迭代 DP
【发布时间】:2013-08-02 14:25:29
【问题描述】:
double R(int N, int x[206], int i, int c){
    if (memo[i][c] != 0) return memo[i][c];

    if (i==N){
        if (c>=23) return 1;
        else return 0;
    }

    double s;
    s = R(N,x,i+1,c+x[i]);
    s += R(N,x,i+1,c-x[i]);
    memo[i][c] = s;
    return s;
}

现在这是一个递归记忆函数,但如果可能,我想将其转换为迭代等效 DP。或者这是我能做到的唯一方法?

【问题讨论】:

  • 一堆gotostack 可以模拟递归。
  • 不知道x的内容和常数N是很困难的。
  • N为整数,最大可达206左右,x为任意整数数组

标签: c++ recursion dynamic-programming memoization


【解决方案1】:

理论上,您可以将任何递归方法转换为迭代方法。所以,是的,这段代码也可以。

关于它的更多信息在这个帖子中:https://stackoverflow.com/questions/931762/can-every-recursion-be-converted-into-iteration

【讨论】:

  • 我知道每个递归都可以翻译,但我想问如果有意义的话,如何翻译这个递归,如果我的英语不好,对不起
  • 我回答了你问题的第二部分。但是,如果您希望我们为您完成所有工作,那么……这可能是个问题。这个网站更多的是关于“我试图解决这个问题,但我被困在这里”而不是“为我解决这个问题”。向我们展示您已经完成的工作,一个特定的问题,因为您已经知道它可以转化为迭代 :)
  • 如果我知道该怎么做,我就不会问这个问题了。
  • 不,不是作业。我尝试通过不递归来重新创建它,但问题是我不知道最终值,因为我需要首先通过逐步遍历其他所有内容来计算它们,所以不确定流程是什么
【解决方案2】:

由于 x 可以包含任意整数,因此您应该真正计算 Ranyc 其中i 是固定的。 一些代码来解释:

// case where i == N
for (int c = INT_MIN; c < INT_MAX; ++c) {
   memo[N][c] = (c>=23) ? 1 : 0;
}

for (int k = N - 1; k >= i; --k) {
  for (int c_ = INT_MIN; c_ < INT_MAX; ++c_) {
     memo[k][c_] = memo[k+1][c_ + x[k]] + memo[k+1][c_ - x[k]];
  }
}
return memo[i][c];

也许对x 的值进行一些限制有助于改善结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2014-03-01
    • 2020-05-08
    • 1970-01-01
    • 2015-08-22
    • 2016-01-26
    相关资源
    最近更新 更多