请告诉我这个dp示例中的memoization是如何工作的。 dp example problem, codechef
我卡住的部分就像输入是4那么为什么代码在计算 n-1,即4-1,当最佳步长为4/2或输入= 10时为什么我们将计算n-1直到1.任何帮助将不胜感激。 动态编程新手,请耐心等待。
答案 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=4
和F(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);