简介
无后效性是动态规划的一个基本特征之一,只有具备了无后效性的问题才可以使用动态规划求解。直观上讲,无后效性是指“现在不会影响未来”,或者说现在的决策不会影响未来如何决策。一个不具有无后效性的例子是矩阵寻路算法。设想一个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][