解题思路:
简单题,看出是dp之后一开始想的是一维就能表示。
错误想法:f[i] 表示前 i 个屋子最多偷多少钱,然后想了下方程是前一天可以偷也可以不偷。然后发现f[i]不能确定第i个偷没偷。所以把定义改成前i个屋子最多偷多少钱并且第 i 天偷了。然后一想又不对。可以是前一天偷了,但是如果前一天没偷没法表示。于是这道简单题错误想法出现了两次。
状态表示:
f[i][?] 表示前i天最多能偷多少。?是0表示第 i 天没偷,是1表示偷了。
状态计算:
f[i][0] 前一天可以偷可以不偷。
所以:f[i][0] = max(f[i-1][0], f[i-1][1])
f[i][1] 前一天就不能偷了,只能是前 i - 2 天最多能偷多少,然后加上第 i 天的。
所以:f[i][1] = max(f[i-1][0], f[i-1][1]) + nums[i]
可以看到前面的这部分和f[i][0]一样,所以f[i][1] = f[i][0] + nums[i]
AC代码:
class Solution {
public int rob