algorithm - 打印动态规划解决方案中遍历的路径

标签 algorithm graph path state dynamic-programming

问题很简单:在典型的动态规划解决方案中,如何打印最终解决方案计算过程中遍历的实际状态?

让我试着借助一个例子来解释我到底需要什么-

假设,我们有一个DP解决方案来解决每个状态都有二维的问题,即解决方案中的状态看起来像(i,j)。现在,我们有一个起始状态 (0,0) 和一些最终状态:(i,n) ,其中 i 从 0 到 n 变化。

因此,典型的解决方案将像这样工作:

Start from a starting state: in this case -> (0,0)
Move to the next state based on some computation: suppose from (0,0), we could go to (1,0), (1,1) or (1,2).
.
.
Keep on traversing until we reach one of the end states: in this case (i,n), for any i.

现在,我需要打印在此解决方案中遍历的路径。基本上,如果我能找出我从哪个状态到达了最终状态,我就可以使用该逻辑返回到起始状态,然后打印路径。 p>

P.S.:如果这个问题看起来太明显了,我们深表歉意。

最佳答案

  1. 您可以在计算期间显式存储此信息。也就是说,除了DP(i, j),你还可以保存PARENT(i, j),它代表了我们从中获得结果的状态(i, j)(并在初始计算期间进行转换时正确更新它)。

  2. 有时,我们可以计算 PARENT(i, j) 而无需显式存储它。情况是这样的:

    • 有可能找出我们可以从哪些状态转换到当前状态。

    • 我们可以检查某个转换是否为我们提供了该状态的最佳解决方案。

当我们知道每个状态的父级时,我们就可以从最终状态开始迭代,将每个状态添加到一个列表中,然后继续到它的父级,直到我们到达起始状态(如果需要,最后反转列表).我们也可以递归地做同样的事情。

这是一个(可能微不足道的)例子:

假设我们正在解决一个标准问题:给定一个上面有数字的网格,如果我们只能向右或向下移动,请找到从左上角到右下角的路径,其总和最大。

显式计算父级(我在这里省略了极端情况):

if dp(i - 1, j) > dp(i, j - 1) then
    dp(i, j) = a(i, j) + dp(i - 1, j)
    par(i, j) = (i - 1, j)
else
    dp(i, j) = a(i, j) + dp(i, j - 1)
    par(i, j) = (i, j - 1)

隐含地:

let getPar(i, j)
    if dp(i - 1, j) > dp(i, j - 1)
        return (i - 1, j)
    return (i, j - 1)

这个想法对于更复杂的问题是一样的。

关于algorithm - 打印动态规划解决方案中遍历的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29447416/

相关文章:

graph - 从一组顶点和边创建 ASCII 图的工具?

r - 同一图上的多条频率线,其中 y 是字符值

linux - 如何让 `MANPATH=~/.nmap/doc man 1 nmap` 寻找 nmap.1?

grails - 如何使用 Grails 访问项目目录中的文件

string - 为什么最长公共(public)子串不是词干提取算法的解决方案?

c - 从整数子集中均匀随机选择一个数的算法

algorithm - 100万节点的链表如何实现?

python - 如果最后 N 个元素为 0 且为常量,则删除它们

algorithm - 如何检查给定数字是否为 x^y 形式?

java - 确定应在 Java 中存储程序文件的位置