【线性DP】打家劫舍

【题目链接】

打家劫舍

【题目描述】

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

【输入输出样例】

1 2 3 1

4
【数据范围】

1 <= nums.length <= 100
0 <= nums[i] <= 400

状态表示:f[i] 表示偷窃到第i家的最大金额

状态转移:

假设小偷当前偷盗第i家:

如果决定偷f[i]的话,由于不能偷窃相邻的两家,那么当前状态就必不可能从f[i - 1]转移得到,因此f[i] = f[i - 2] + monety[i]

 

如果决定不偷f[i],那么f[i]就从f[i - 1]转移得到,即f[i] = f[i - 1]

 

 

 之后取两种决策的最大值即可,f[i] = max(f[i - 2] + monety[i], f[i - 1]);

 

 1 const int N = 109;
 2 int f[N];
 3 class Solution {
 4 public:
 5     int rob(vector<int>& nums) {
 6         if(nums.size() == 1)
 7             return nums[0];
 8         f[0] = nums[0];
 9         f[1] = max(nums[0],nums[1]);
10         for(int i = 2;i < nums.size();++i)
11             f[i] = max(f[i - 1],f[i - 2] + nums[i]);
12         return f[nums.size() - 1];
13     }
14 };

 

posted @ 2021-10-14 21:40  Modest-Hamilton  阅读(38)  评论(0)    收藏  举报