当前位置:网站首页>【Brush the title】Family robbery
【Brush the title】Family robbery
2022-08-02 01:36:00 【m0_60631323】
一、题目
OJ链接
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 .
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额.
示例:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的.
二、题解
2.1动态规划
Essentially, what is sought is the maximum cumulative sum of subsequences in the case that adjacent numbers cannot be taken
But this question has a special limitation:
That is, the first number and the last number in the array are considered adjacent,That is, we cannot choose the first number and the last number at the same time,那么我们可以这样做,分两种情况
1)从0~n-2上做选择
2)从1~n-1上做选择
返回两种情况的较大值
源码:
️
public int rob (int[] nums) {
if(nums.length==1) {
return nums[0];
}
if(nums.length==2) {
return Math.max(nums[0],nums[1]);
}
int N=nums.length;
int[] dp1=new int[N];
dp1[0]=nums[0];
dp1[1]=Math.max(nums[0],nums[1]);
for(int i = 2; i <N-1; i++){
int p1=dp1[i-1];
int p2=dp1[i-2]+nums[i];
dp1[i]=Math.max(p1,p2);
}
int[] dp2=new int[N];
dp2[1]=nums[1];
dp2[2]=nums[2];
for (int i = 3; i <N ; i++) {
int p1=dp2[i-1];
int p2=dp2[i-2]+nums[i];
dp2[i]=Math.max(p1,p2);
}
return Math.max(dp1[N-2],dp2[N-1]);
}
This code can still be optimized,因为dp[i]只依赖dp[i-1]和dp[i-2],So we can use several variable scrolling insteaddp数组
优化后:
️
public int rob(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
if (nums.length == 2) {
return Math.max(nums[0], nums[1]);
}
int N= nums.length;
int pre1=nums[0];
int pre2=Math.max(nums[0],nums[1]);
for (int i = 2; i < N-1; i++) {
int tmp=Math.max(pre1+nums[i],pre2);
pre1=pre2;
pre2=tmp;
}
int ans1=pre2;
pre1=nums[1];
pre2=Math.max(nums[1],nums[2]);
for (int i = 3; i < N; i++) {
int tmp=Math.max(pre1+nums[i],pre2);
pre1=pre2;
pre2=tmp;
}
int ans2=pre2;
return Math.max(ans1,ans2);
}
边栏推荐
- 信息收集之目录扫描-dirbuster
- IDEA找不到Database解决方法
- DCM 中间件家族迎来新成员
- Detailed explanation of fastjson
- datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
- 创新项目实战之智能跟随机器人原理与代码实现
- 3 Month Tester Readme: 4 Important Skills That Impacted My Career
- 6-25漏洞利用-irc后门利用
- IDEA版Postman插件Restful Fast Request,细节到位,功能好用
- 哈希表
猜你喜欢
随机推荐
ImportError cannot import name ‘Mapping‘ from ‘collections‘
Use flex-wrap to wrap lines in flex layout
ELK日志分析系统
Interview: Briefly describe a project you are involved in
iframe使用
Kubernetes — 核心资源对象 — Controller
管理基础知识11
6-24漏洞利用-vnc密码破解
go泛型使用方法
浅谈国产ERP的“横纵竖”三向发展态势
For effective automated testing, these software testing tools must be collected!!!
Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性
html+css+php+mysql实现注册+登录+修改密码(附完整代码)
C语言实验六 一维数组程序设计
23.卷积神经网络实战-ResNet
管理基础知识14
管理基础知识20
信息收集之cms指纹识别
百度、百图生科 | HelixFold-Single: 使用蛋白质语言模型作为替代进行无MSA蛋白质结构预测
Flink_CDC construction and simple use









