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

打家劫舍

题目难度:高阶

时间限制:1000ms

内存限制:256mb

题目描述

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

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

输入格式

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

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

输出格式

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

样例数据
输入样例
复制代码
4
1 2 3 1
输出样例
复制代码
4
数据范围

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


思路:

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

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

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

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

分析一下,假设我们知道了dp1到dp4的所有结果,现在我们要求dp5,应该怎么求呢?

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

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

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

现在我们知道了,已经有两种选择,所以dpi=max(dpi-2+ai,dpi-1);

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

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

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

dp2=max(a1,a2);从第一间房子偷到第二间房子,我们只能偷一间房子,否则就会触发警报,只能偷第一间或第二间

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


代码:

cpp 复制代码
#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;
}
相关推荐
Tisfy6 小时前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
aqiu1111116 小时前
【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)
c++·算法·leetcode
lojox6 小时前
深入理解 C++ STL:vector 底层实现、迭代器失效与 list 特性
开发语言·c++
微笑星河q7 小时前
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
开发语言·c++
yi0118 小时前
DAY28: LeetCode 111. 二叉树的最小深度
人工智能·笔记·python·算法·leetcode·二叉树·递归
|_⊙8 小时前
C++ 类和对象零散知识点
开发语言·c++
wuyk5558 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
xiangyun618 小时前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5858 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
信奥卷王8 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法