阅读"算法简介"通过cormen,第15章:动态编程,我发现了这个陈述
在开发动态编程算法时,我们遵循一系列 四个步骤:
描述最佳解决方案的结构。
递归定义最佳解决方案的价值。
计算最佳解决方案的价值,通常采用自下而上的方式。
- 根据计算信息构建最佳解决方案。
醇>步骤1-3构成了解决问题的动态编程解决方案的基础。要是我们 我们只需要最优解的价值,而不是解决方案本身 可以省略第4步。当我们执行第4步时,我们有时会保持额外的 步骤3中的信息,以便我们可以轻松构建最佳解决方案。
我不明白第3步和第4步的区别。
计算最佳解决方案的价值
和
构建最佳解决方案。
我希望通过进一步阅读来理解这一点,但却未能理解。 有人可以通过举例来帮助我理解这个吗?
答案 0 :(得分:4)
假设我们使用动态编程来确定是否有[1,3,4,6,10]的子集总和为9。
第3步的答案是值,在本例中为“TRUE”。
步骤4的答案是计算出总和为9的实际子集,在本例中为“3 + 6”。
答案 1 :(得分:0)
在动态编程中,我们大部分时间都会得到一个巨大的结果哈希值。然而,最初它只包含从第一个,最小的,最简单的(底部)情况获得的结果,并且通过使用这些初始结果并在它们之上计算,我们最终合并到目标。此时,大多数时间哈希中的最后一项是目标(步骤3已完成)。然后我们将不得不处理它以获得所需的结果。
一个完美的例子可能是找到总计达目标的最小立方体数量。目标是500,我们应该得到[5,5,5,5],如果目标是432,我们必须得到[6,6]。
所以我们可以在JS中实现这个任务,如下所示;
function getMinimumCubes(tgt){
var maxi = Math.floor(Math.fround(Math.pow(tgt,1/3))),
hash = {0:[[]]},
cube = 0;
for (var i = 1; i <= maxi; i++){
cube = i*i*i;
for (var j = 0; j <= tgt - cube; j++){
hash[j+cube] = hash[j+cube] ? hash[j+cube].concat(hash[j].map(e => e.concat(i)))
: hash[j].map(e => e.concat(i));
}
}
return hash[tgt].reduce((p,c) => p.length < c.length ? p:c);
}
var target = 432,
result = [];
console.time("perf:");
result = getMinimumCubes(target);
console.timeEnd("perf:");
console.log(result);
所以在这段代码中,hash = {0:[[]]},
是第1步;最终准备hash[tgt]
的嵌套for循环实际上是第3步,返回阶段的.reduce()
仿函数是第4步,因为它形成了散列的最后一项(hash[tgt]
)通过筛选总和达到目标值的所有结果中的最短结果,给出我们想要的结果。
对我而言,第2步有点无意义。不是因为提到递归而是因为意义。此外,我从未在动态编程中使用或看过递归方法。最好使用while
或for
循环实现。