当前位置: 首页 > news >正文

福州网站制作电子商务网站建设与管理 学习感想

福州网站制作,电子商务网站建设与管理 学习感想,怎样做网络推广外包,网站建设 前景 html5213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…

213. 打家劫舍 II(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列

将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因此可以把这道题简化为两个单排排列的子问题

  • 可以选择第一个房间进行偷窃,也就是考虑 nums[0...n-2]
  • 可以选择最后一个房间进行偷窃,也就是考虑 nums[1...n-1]

综合上述两种情况,选择偷窃金额最多的情况作为本题的答案。

状态定义

根据题解,本道题将定义两种状态:

  • first[i]:表示可以选择第一个房间的偷窃情况下,到第 i 个房间为止的最多金额;
  • last[i]:表示可以选择最后一个房间的偷窃情况下,到第 i 个房间为止的最多金额;

状态转移方程

对于每个房间,都有偷窃和不偷窃两种选择,以第 i 个房间为例:

  • 如果选择偷窃这个房间 i ,那么前一个房间肯定不能偷窃,所以当前的金额是第 i-2 个房间的金额加上该房间的现金,即first[i] = first[i-2] + nums[i-1];
  • 如果选择不偷窃该房间,所以当前的金额和前一个房间的金额相等,即 first[i] = first[i-1];

我们要得到偷窃到的最高金额,也就是在这两种情况中选择金额最高的,即 first[i] = max(first[i-1], first[i-2] + nums[i-1]);

对于 last数组,它的状态转移方程是一致的。

初始化

  • first [0] = last[0] = 0;,第 0 个房间,也就意味着还没有实施偷窃,所以金额为 0;
  • first[1] = nums[0] , last[1] = nums[1]; first 和 last 的第一个房间的金额分别设置为 第一个房间的现金。

最终的返回结果

在题解中已经解释了,我们需要返回两种情况下的最大金额, 即 return max(first[n-1], last[n-1]);

代码

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());vector first(n, 0);vector last(n, 0);first[1] = nums[0];for(int i=2; i<n; ++i){first[i] = max(first[i-1], first[i-2] + nums[i-1]);cout<<"i:"<<i<<" "<<first[i]<<endl;}last[1] = nums[1];for(int i=2; i<n; ++i){last[i] = max(last[i-1], last[i-2] + nums[i]);}return max(first[n-1], last[n-1]);}
};

空间压缩

由于 first[i] 只和前两个状态有关,因此可以进行空间压缩。

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());int cur_first , pre1 = 0, pre2 = nums[0];for(int i=2; i<n; ++i){cur_first = max(pre2, pre1 + nums[i-1]);pre1 = pre2;pre2 = cur_first;}int cur_last;pre1 = 0, pre2 = nums[1];for(int i=2; i<n; ++i){cur_last = max(pre2, pre1 + nums[i]);pre1 = pre2;pre2 = cur_last;}return max(cur_first, cur_last);}
};

代码简化

显然,两个 for 循环的结构一致,所以可以将 for 循环写成子函数,也可以再定义两个变量,将两个 for循环整合到一起。这里只展示第二种写法:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n<=3) return *max_element(nums.begin(), nums.end());int cur_first ,cur_last;int pre1 = 0, pre2 = nums[0], pre3 = 0,pre4 = nums[1];for(int i=2; i<n; ++i){cur_first = max(pre2, pre1 + nums[i-1]);cur_last = max(pre4, pre3 + nums[i]);pre1 = pre2;pre2 = cur_first;pre3 = pre4;pre4 = cur_last;}return max(cur_first, cur_last);}
};
http://www.yayakq.cn/news/30258/

相关文章:

  • 单页营销式网站模板下载公司网站是如何搭建的
  • 如何做网站logo在试用网站做推广
  • 超市网站建设方案网站建设公司营业执照图片
  • 高端建设网站企业网页设计与制作课件清华大学
  • 家装网站建设公司哪家好建立企业网站流程
  • 找网站建设公司需要注意什么国家外管局网站怎么做收汇
  • 潮汕学院网站开发怎么建设自己的论坛网站
  • 怎样查网站的注册地点南京环力建设有限公司网站
  • 建站最好的长沙网站制作公司地址
  • 手机怎么制作网站淘宝客api同步到网站
  • 做网站互联网公司排名wordpress 音乐播放器
  • 怎么买网站iis部署网站 红叉
  • 深圳市电商网站建设企业做环评需要关注哪些网站
  • 旅游网站设计源码wordpress子主题制作
  • 闲置物品交易网站怎么做做个公司网站一般需要多少钱
  • 东莞长安网站建设一级a做爰片拍网站
  • 微信网站 影楼惠州seo外包公司
  • 深圳品牌网站制作咨询电话浙江建设厅网站官网
  • 网站搭建平台都有哪些平面设计图怎么画
  • 网站如何做微信推广方案设计宁海企业网站建设
  • 做英文网站的心得平面设计网站编辑招聘
  • 嘉定区 网站建设十大网络游戏
  • 保定酒店网站制作建成学校网站
  • 对网站建设 意见和建议旅行社网站程序
  • 做设计找图有哪些网站有哪些问题免费推广方式有哪些
  • 如何用本机电脑做网站服务器吗互联网公司 网站
  • ps网站建设目标网站建设的工具是
  • 太原网站制作优化seo公司软件开发外包网
  • 系部网站开发项目的目的建设工程消防监督管理规定网站
  • 外贸网站联系方式模板免费游戏外包公司