动态编程中的memoization

时间:2017-01-03 18:36:54

标签: algorithm dynamic-programming

请告诉我这个dp示例中的memoization是如何工作的。 dp example problem, codechef

我卡住的部分就像输入是4那么为什么代码在计算 n-1,即4-1,当最佳步长为4/2或输入= 10时为什么我们将计算n-1直到1.任何帮助将不胜感激。 动态编程新手,请耐心等待。

3 个答案:

答案 0 :(得分:0)

动态编程中的记忆只是将解决方案存储到子问题中。对于输入n = 4,您可以计算其解决方案。因此,您尝试步骤1.将1 +解决方案减去子问题n = 3。为了评估你需要解决问题n = 3,因为你以前没有解决过它。所以你再次尝试第1步,直到你得到n = 1的基本问题,你输出0。

尝试执行当前问题的步骤1后,尝试执行步骤2,这意味着将n分开,然后尝试执行步骤3.您可以尝试每个子问题的每个步骤,但因为您在每个子问题中存储了最佳值,所以您可以在它再次发生。

例如,当您尝试执行步骤1后回到n = 4时,您尝试执行步骤2,并且您看到可以使用n / 2,因为您已经计算了n = 2的最佳值,您可以输出1 + n = 2的最佳值,即1,所以总共为2。

答案 1 :(得分:0)

该链接相当清楚地解释了它。如果removeUser是将F(n)转换为n的最小步骤数,那么对于任何1,我们都有以下递归关系:

n > 1

对于您的情况F(n) = 1 + min(F(n-1), F(n/2), F(n/3)) // if n divisible by 2 and 3 F(n) = 1 + min(F(n-1), F(n/2)) // if n divisible by 2 and not 3 F(n) = 1 + min(F(n-1), F(n/3)) // if n divisible by 3 and not 2 F(n) = 1 + F(n-1) // all other cases ,我们必须计算n=4F(n-1)以确定哪一个最小。

关于第二个问题,我们将在F(n/2)时首先评估n=10。在此评估期间,计算所有值F(9)记忆。然后,当我们评估F(8), F(7), ... F(2)时,只需查看记忆值数组中的值即可。这将节省大量计算费用。

答案 2 :(得分:0)

您可以在JS中执行以下操作;

function getSteps(n){
  var fs = [i => i%3 ? false : i/3, i => i%2 ? false : i/2, i => i-1],
     res = [n],
     chk;
  while (res[res.length-1] > 1) {
    chk = false;
    fs.forEach(f => !chk && (chk = f(res[res.length-1])) && res.push(chk));
  }
  return res;
}
var result = getSteps(1453);
console.log(result);
console.log("The number of steps:",result.length);