算法 {记录DP路径}

算法 {记录DP路径}

记录DP路径

定义

假如最终DP答案是DP[x], 我们求出来 x对应的DP路径 (即以x为终点的 DAG图中的路径);

比如你的答案路径是a->b->c (这个路径的值等于DP[c]), 最终你拿着这个DP[c]的值 想要知道 他的前驱节点是谁, 因此 需要一个DPrec[x]来表示 谁更新的DP[x] (也就是以x为终点的最终路径上 x的前驱节点是谁), 即DPrec[c]=b, DPrec[b]=a;
. 参见@LINK: (https://editor.csdn.net/md/?not_checkout=1&articleId=130448844)-(@LOC_2);

性质

@DELI;

记录DP路径, 你DP的更新方式 是前驱/后继都可以;
从DAG的角度,DP路径 一定是DPrec[ 终点] = 起点 (比如有条边a->b 则记录DPrec[b] = a 不会反过来); 说白了, DP记录的是: 哪个前驱节点 得到的当前DP;
这与前驱/后继的DP更新方式 是毫无关系的, 对于前驱更新 即DP[cur] <- DP[pre] 记录DPrec[cur] = pre, 而对于后继更新方式 DP[cur] -> DP[nex] 则记录DPrec[nex] = cur; 都可以记录DP路径, 而且DPrec的定义是一致的 即DPrec[x] = 谁更新的DP[x];

错误

#错误做法#: 等DP流程处理完后 再倒着(即反向遍历DAG序)再跑一遍 去构造DPrec[], 而且这也不一定可行 因为对于后继更新方式 你倒着来 也无法获得其前驱节点呀… 而且即使是前驱方式 你倒着遍历DAG序 也非常麻烦;
其实不管是前驱/后继更新方式, 你都可以让 DP过程 和 DPrec记录路径 两个步骤 同时进行, 就在原先DP的基础上 再加一行代码即可: 当DP转移时 即DP[a] 更新了 DP[b] 那就记录一个DPrec[b] = a;

算法

后继更新方式

就在原先DP代码的基础上, 直接嵌入这个代码即可;

curDP = DP[cur];
if( curDP 可以更新 DP[nex]){
	更新DP[nex];
	DPrec[ nex] = cur;
}

前驱更新方式

就在原先DP代码的基础上, 直接嵌入这个代码即可;

curDP = DP[cur];
if( DP[pre] 可以更新 curDP){
	更新DP[cur];
	DPrec[ cur] = pre;
}

应用

@LINK: https://editor.csdn.net/md/?articleId=138968666;
反向DP + 最小字典序;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能搜索策略中的动态规划(Dynamic Programming, DP)是一种高效的解决方案,广泛应用于搜索问题中。DP通过将一个大问题划分为一系列子问题,并记录子问题的结果,从而大大减少了问题的规模和计算量。在搜索过程中,DP会使用之前计算过的子问题结果以加速搜索速度,避免重复计算。 回溯(Backtracking)是一种深度优先搜索的策略,常用于求解集合类问题或满足约束条件的解。通过回溯,我们可以枚举所有可能的解,并逐步构建可行解,一旦发现当前解无法满足条件,就会进行回溯,取消之前的选择,继续尝试其他可能的选择。回溯算法适用于问题解空间较大且不易剪枝的场景,但由于需要枚举所有可能,其搜索速度可能较慢。 最短路径算法常用于寻找两个节点之间的最短路径,其在实际应用中具有广泛的意义。其中,最著名的算法是Dijkstra算法和A*算法。Dijkstra算法通过维护一个节点到其他节点的最短距离表,不断更新并选择最短路径,直到找到目标节点为止。而A*算法基于评估函数(通常是启发式函数)来指导搜索,通过估计当前节点到目标节点的距离,选择距离目标节点最近的节点进行探索,以更快地找到最短路径。 综上所述,动态规划、回溯和最短路径是人工智能搜索策略中常用的方法。DP通过划分子问题并记录结果,加速搜索过程;回溯通过枚举所有可能的解,并回溯取消选择,适用于搜索解空间较大的问题;最短路径算法常用于寻找两节点之间最短路径,并分别利用Dijkstra算法和A*算法进行求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值