思路1:
我们可以定义一个数组,为f[]f[]。
f[i]f[i] 表示抢劫前ii家能得到的最多现金数量。
那么我们前ii家的抢劫结果就有两种情况:
第一种情况:不偷第ii家店铺
那么f[i]=f[i−1];f[i]=f[i−1];
第二种情况:偷第ii家店铺
那么f[i]=f[i−1]+w[i].f[i]=f[i−1]+w[i].
(w[i]w[i] 表示第ii家店铺总共的现金)
思路1出现的问题:
如果第i−1i−1 家店已经被抢了,那么如果抢了第i家,那是不符合题目要求的。
那怎么办呢?
正确方法(思路2):
我们把ff数组定为二维的,即f[][]f[][]
我们用数组储存两种情况:偷与不偷。
f[i][0]f[i][0] 代表的是不偷第ii家店铺能得到的最多现金数量;
f[i][1]f[i][1] 代表的是偷第ii家店铺能得到的最多现金数量。
则就会出现三种情况:
https://cdn.acwing.com/media/article/image/2020/10/31/51974_a6aa04a31b-1.png
解释:
图中红色的线是可行方案,你可以不抢第i−1i−1家,也不抢第ii家;
你可以不抢第i−1i−1家,但抢第ii家。
你可以抢第i−1i−1家,但不抢第ii家;
那么我们就可以得出状态转移方程了:
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = f[i - 1][0] + w[i];