维护无后效性的技巧——立即计算代价

本文介绍了动态规划中的无后效性概念,并通过最优二分检索树、删数问题和任务安排三个实例,阐述如何通过立即计算代价来维护无后效性。每个例子都涉及到在决策过程中如何处理乘法运算,以避免影响未来的决策。通过将乘法视为加法,即时结算决策的影响,可以简化问题并确保算法的正确性。
摘要由CSDN通过智能技术生成

简介

无后效性是动态规划的一个基本特征之一,只有具备了无后效性的问题才可以使用动态规划求解。直观上讲,无后效性是指“现在不会影响未来”,或者说现在的决策不会影响未来如何决策。一个不具有无后效性的例子是矩阵寻路算法。设想一个0-1矩阵,寻找一条从1,1到n,n的最短路,不能使用下面的记忆化搜索算法:

FIND-PATH(x,y)
  if (out of matrix) return ∞
  if (x,y == n,n) return 0
  return dp[x][y] = min(FIND-PATH(x+1,y), FIND-PATH(x-1,y), FIND-PATH(x,y+1), FIND-PATH(x,y-1) )

/*例如
1 0 0 0
1 0 1 1
1 1 1 1
1 0 0 1
这个算法会陷入无限递归
*/

为什么这个算法无法正确结束呢?不难发现,这个算法并没有在决策(x,y)后要求以后不再递归计算(x,y),这就导致递归计算(x,y)的前提包括求解(x,y),算法会一直执着于递归计算(x,y)而无法正确结束。
不难想到增加一个辅助数组now[][] = {0}。没要计算一个(x,y)的时候就now[x][y] = 1防止落入死循环。

FIND-PATH(x,y)
  if (out of matrix or now[x][y]) return ∞
  if (x,y == n,n) return 0
  now[x][y] = 1
  // 锁死(x,y)
  ans = min(FIND-PATH(x+1,y), FIND-PATH(x-1,y), FIND-PATH(x,y+1), FIND-PATH(x,y-1) )
  now[x][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值