LeeCode-198-打家劫舍思路+代码
思路+代码解析
状态转移方程
1、如果只有一家的话,就只能抢这一家,即最优解。
2、如果只有两家的话,最优解为这两家钱最多的一家
3、如果有多于两家的话,关键点为第(n-1)家。如果抢了第(n-1)家,说明在前(n-1)家里已经求得最优解。如果没抢第(n-1)家,说明在前(n-1)家里,小偷在前(n-2)家已经求得最优解,所以小偷也一定会去第n家。那么在n家里最优解为f(n-2)+M(n)。所以在n家里,最优解为f(n-1)和f(n-2)+M(n)中最大值。
递归算法
// 递归
int djjs_dg(vector<int> v)
{
//v代表初始
int len = v.size();
// 只有一家超市,只能抢这家
if (len == 1)
{
return v.at(0);
}
//有两家超市,抢钱多的那家
else if (len == 2)
{
return max(v.at(0), v.at(1));
}
//有n家超市(n>2)
//是否抢n-1的那家,不抢就是前n-2个+第n个
//抢n-1那家就是前n-1家
else
{
vector<int> v1;
vector<int> v2;
//切片
v1.assign(v.begin(), v.end() - 1);
v2.assign(v.begin(), v.end() - 2);
return max(djjs_dg(v1), djjs_dg(v2)