Algorithm 打印动态规划解决方案中经过的路径

Algorithm 打印动态规划解决方案中经过的路径,algorithm,graph,path,state,dynamic-programming,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 b

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

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

假设我们有一个问题的
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.
现在,我需要打印此解决方案中经过的路径。基本上,如果我能找到我从哪个状态到达最终状态,我就可以使用这个逻辑返回到起始状态,然后打印路径

附言:如果问题太明显,请道歉

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

  • 有时,我们可以计算父(i,j),而不显式地存储它。在以下情况下:

    • 我们可以找出从哪些状态可以过渡到当前状态

    • 我们可以检查转换是否为这种状态提供了最佳解决方案

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

    以下是一个(可能是微不足道的)示例:

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

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

    含蓄地:

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

    对于更复杂的问题,想法也是一样的。

    没错!但是,我们如何计算和保存每个州的父项(i,j)是我试图理解的。你能解释一下你建议如何为每个州计算
    Parent(i,j)
    let getPar(i, j)
        if dp(i - 1, j) > dp(i, j - 1)
            return (i - 1, j)
        return (i, j - 1)