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

【c++】打家劫舍(动态规划)

打家劫舍

题目难度:高阶

时间限制:1000ms

内存限制:256mb

题目描述

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

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

输入格式

第一行一个整数n,表示房屋的数量。

第二行n个整数,空格隔开,依次表示沿街n个房屋内的现金数量。

输出格式

一个整数,表示小偷能得到的最高金额。

样例数据
输入样例
4
1 2 3 1
输出样例
4
数据范围

对100%的数据,2<n≤10^5,每个房屋内金额不超过1000。


思路:

不要被这个高阶的难度吓到了,其实很简单

首先,我们知道这是动态规划,所以定义一个数组,long long dp[n+10];

dp[i]代表从第一家一直偷到第i家最多能投到多少钱(比如dp[5]表示从第一家到第五家最多偷几块钱)

好的,现在我们只要知道,dp[i]等于什么就好了(状态转移方程)

分析一下,假设我们知道了dp[1]到dp[4]的所有结果,现在我们要求dp[5],应该怎么求呢?

因为我们不能偷相邻的房间,所以现在我们求dp[5]有两种选择:

1、dp[5]=dp[4],这是什么意思呢?就是说,我们从第一间房子偷到第四间房子,已经偷了很多钱(比如已经偷了114514元钱),如果从第一间房子偷到第三间房子,再偷第五间房子,可能只能偷到1元,这种时候,最好的情况就是偷到第四间房子停下来,不偷第五间了,所以dp[5]只能等于偷到第四件的最大钱数

2、dp[5]=dp[3]+a[5],这又是什么意思呢?就是从第一间房子偷到第三间房子,再偷第五间房子,这样偷到的钱可能会比偷到第四间房子偷的多,所以我们就会选择能偷更多的2号方案(就是从第一间房子偷到第三间房子,再偷第五间房子)

现在我们知道了,已经有两种选择,所以dp[i]=max(dp[i-2]+a[i],dp[i-1]);

现在,我们还需要解决一个问题:

如果dp[i]=max(dp[i-2]+a[i],dp[i-1]);那么当i=3或者4时,需要用到dp[1]或dp[2],但求dp[1]要求出dp[1-2]=dp[-1],但我们不可能有dp[-1]这个数组,所以,dp[1]和dp[2]要我们提前求出来

dp[1]就等于第一间房子的钱数(从第一间房子偷到第一间房子,我们最多只能把第一间房子的钱全拿走)

dp[2]=max(a[1],a[2]);从第一间房子偷到第二间房子,我们只能偷一间房子,否则就会触发警报,只能偷第一间或第二间

那么,我们现在就能写出程序了


代码:

#include<bits/stdc++.h>
using namespace std;
int main(){long long n;cin>>n;long long a[n+10],dp[n+10];//a存每间房子的钱数 for(int i=1;i<=n;i++){cin>>a[i];//读入 }for(int i=1;i<=n;i++){if(i==1){//提前处理dp[1] dp[i]=a[i];}else if(i==2){//提前处理dp[2] dp[i]=max(a[i-1],a[i]);}else{//否则就是正常状态了,直接把状态转移方程抄进去 dp[i]=max(dp[i-2]+a[i],dp[i-1]);}}cout<<dp[n];//输出从第一间房子偷到第n间房子最多偷多少 return 0;
}

相关文章:

  • QWidget|QFrame设置背景透明且可以带有边框颜色
  • Vue(uniapp)父组件方法和子组件方法执行优先顺序
  • MacOS环境变量source生效但重启后又失效
  • Java学习星球,Java学习路线
  • LeetCode:20. 有效的括号——栈和队列
  • 企业引用CRM管理系统软件有什么作用?
  • 在U盘上运行的 Windows
  • Java设计模式(九)—— 中介者模式
  • HTML5支持的视频文件格式和音频文件格式有哪些?
  • 【图神经网络】10分钟掌握图神经网络及其经典模型
  • 【Axure教程】鼠标滚动上下翻页效果
  • Qt 自定义日志类总结
  • 算法学习|动态规划 LeetCode 416. 分割等和子集
  • Scala泛型(泛型方法,泛型类,泛型特质,上下界,协变、逆变、非变)
  • C/C++字符串
  • CentOS 7 修改主机名
  • ES6简单总结(搭配简单的讲解和小案例)
  • Python爬虫--- 1.3 BS4库的解析器
  • spring boot 整合mybatis 无法输出sql的问题
  • Webpack 4 学习01(基础配置)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从零搭建Koa2 Server
  • 第十八天-企业应用架构模式-基本模式
  • 判断客户端类型,Android,iOS,PC
  • 区块链将重新定义世界
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信开源mars源码分析1—上层samples分析
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # include “ “ 和 # include < >两者的区别
  • #define,static,const,三种常量的区别
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (三)mysql_MYSQL(三)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)关于pipe()的详细解析
  • *** 2003
  • ****Linux下Mysql的安装和配置
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 设计一套高性能的弱事件机制
  • .NET连接MongoDB数据库实例教程
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [1] 平面(Plane)图形的生成算法
  • [Bugku]密码???[writeup]
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [Django 0-1] Core.Checks 模块
  • [Editor]Unity Editor类常用方法
  • [HTML]HTML5实现可编辑表格
  • [Latex学习笔记]数学公式基本命令
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作