why does dp not work?

新的体会:本题的本质,是有环的图,应选择bfs,而非dfs(或者自顶向下的dp)。如果是无环的,两者都可行

在leetcode上刷到一题,很有趣,值得一记:1091. Shortest Path in Binary Matrix。简单来说就是求一个矩阵从左上角到右下边的最短距离:在这里插入图片描述

此题和leetcode上的另外一题(题号忘了,以下简称为题1)极为相似。问题都一样,只是路径成立的条件有区别:本题可以从一点周围的所有8个点连过来,而题1只可以从一点的左上、上方、左方三个方向的点连过来。题1可以很快用dp解出,所以我的本能反应也是用dp来解此题。然而编完程后发现程序报StackOverFlowError, 陷入了无限递归调用的死循环。

思考后我明白了,为什么本题不能用dp解?关键是因为问题不能为分解为更小的问题。比如图中相邻的两点a,b,都可以互相影响。而在题1则不然,一定是a点的值可以影响b,而b点的值反过来不能影响a,题目中的条件决定了,一个点的值被其左上、上方、左方三个方向的点的值决定,反过来则不会。所以问题可以被一直分解为更小的问题直到左上角。而这个条件在本题中是不成立的,所以本题只能用BFS来解。

这题体现了运用dp的很重要的一点:所有问题都能被分解为更小的问题(或者说子问题),直到遇到有解的最小问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值