标签:LC198 return nums int max ++ vector 打家劫舍
198. 打家劫舍
法1:状态定义:f[i]
表示抢劫前i
个 可以获得最高金额
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0)return 0;
if(n == 1)return nums[0];
vector<int>f(n + 1);
f[0] = nums[0];
f[1] = max(nums[0],nums[1]);
for(int i = 2; i < n; ++i)
f[i] = max(f[i-1],f[i-2] + nums[i]);
return f[n - 1];
}
};
法2:状态定义:f[i]
表示 以 i
结尾的并且选择了nums[i]
方案中获取的最高金额。
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
vector<int>f(n + 1);
if(n == 1)return nums[0];
f[0] = nums[0];
f[1] = nums[1];
for(int i = 2; i < n; ++i)
for(int j = 0; j < i - 1; ++j)
f[i] = max(f[j] + nums[i], f[i]);
return max(f[n - 1],f[n - 2]);
}
};
优化:
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size(), maxv = 0;
vector<int>f(n + 1);
if(n == 1)return nums[0];
f[0] = nums[0],f[1] = nums[1];
for(int i = 2; i < n; ++i){
maxv = max(maxv, f[i - 2]);
f[i] = max(maxv + nums[i], f[i]);
}
return max(f[n - 1],f[n - 2]);
}
};
法3: 状态定义:f[i][0]
表示没选nums[i]
,考虑前i个可以获得的最高金额,f[i][1]
表示选择了nums[i]
考虑前i个可以获得最高金额。
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
vector<vector<int>>f(n + 1,vector<int>(2));
f[0][1] = nums[0];
for(int i = 1; i < n; ++i){
f[i][1] = f[i - 1][0] + nums[i];
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
}
return max(f[n - 1][0],f[n - 1][1]);
}
};
标签:LC198,return,nums,int,max,++,vector,打家劫舍 来源: https://www.cnblogs.com/Ivessas/p/15132364.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。