题目描述
思路分析
状
态
机
d
p
状态机dp
状态机dp
f
[
i
]
[
j
]
:
状
态
为
i
下
范
围
为
[
0
,
j
]
的
最
大
值
(
i
=
=
1
选
j
,
i
=
=
0
不
选
j
)
f[i][j]:状态为i下范围为[0,j]的最大值(i==1选j,i==0不选j)
f[i][j]:状态为i下范围为[0,j]的最大值(i==1选j,i==0不选j)
分
类
讨
论
,
第
一
次
d
p
默
认
不
选
0
位
置
,
则
f
[
0
]
[
1
]
=
I
N
T
M
I
N
,
无
法
使
其
更
新
其
他
点
即
可
。
最
后
答
案
,
n
−
1
位
置
数
可
选
可
不
选
,
r
e
s
取
最
大
值
;
第
二
次
d
p
默
认
选
0
位
置
数
,
则
必
不
能
选
n
−
1
位
置
数
。
再
和
r
e
s
取
最
大
。
分类讨论,第一次dp默认不选0位置,则f[0][1]=INT_MIN,无法使其更新其他点即可。最后答案,n-1位置数可选可不选,res取最大值;第二次dp默认选0位置数,则必不能选n-1位置数。再和res取最大。
分类讨论,第一次dp默认不选0位置,则f[0][1]=INTMIN,无法使其更新其他点即可。最后答案,n−1位置数可选可不选,res取最大值;第二次dp默认选0位置数,则必不能选n−1位置数。再和res取最大。
代码实现
class Solution {
public:
int rob(vector<int>& nums) {
int res=0;
int n=nums.size();
vector<vector<int>> f(2,vector<int>(n));
//必不选0的前提下
f[0][0]=0,f[1][0]=INT_MIN;
for(int i=1;i<n;i++){
f[1][i]=f[0][i-1]+nums[i];
f[0][i]=max(f[0][i-1],f[1][i-1]);
}
res=max(f[1][n-1],f[0][n-1]);
//必选0
f[0][0]=INT_MIN,f[1][0]=nums[0];
for(int i=1;i<n;i++){
f[1][i]=f[0][i-1]+nums[i];
f[0][i]=max(f[0][i-1],f[1][i-1]);
}
res=max(res,f[0][n-1]);
if(n==1) return nums[0];
return res;
}
};