【动态规划】求数组不相邻元素之和最大

[动态规划]求数组不相邻元素之和的最大值 这个程序的时间复杂度是O(n^2),因为它需要遍历所有可能的子数组。这个问题的具体描述是:给定一个长度为n的数组,从其中任意选择不相邻的元素形成子数组,求这个子数组所有元素之和的最大值。给定一个长度为n的数组,从其中任意选择不相邻的m个元素形成子数组,求这个子数组所有元素之和的最大值。对于每个元素,我们有两个选择:选择这个元素,或者不选择这个元素。如果我们选择这个元素,那么我们不能选择前一个元素,所以最大和就是。)的子数组中,所有不相邻元素之和的最大值。个元素时,所有不相邻元素之和的最大值。 阅读详情

我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎专栏:https://zhuanlan.zhihu.com/Microstrong

Github:https://github.com/Microstrong0305

个人博客:https://blog.youkuaiyun.com/program_developer

题目描述:

在数组中取出一个或多个不相邻数,使其和最大,即找到max(不相邻元素组成的子数组)。

题目分析:

(1)最优子结构:

OPT(6):表示数组下标为6时,子数组和最大的最优解。最优解又分为两种情况:1.选数组下标为6的数字+OPT(4)。2. 直接是OPT(5)。

(2)状态转移方程:

(3)边界条件:

代码实现:

(1)递归求解

public class sumMax {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {1, 2, 4, 1, 7, 8,3};
		System.out.println(rec_opt(arr,6));
	}
	
	/**
	 * 递归解法
	 * @param arr
	 * @param i
	 * @return
	 */
	public static int rec_opt(int[] arr, int i) {
		if(i == 0)
			return arr[0];
		else if (i == 1)
			return Math.max(arr[0], arr[1]);
		else {
			int a = rec_opt(arr, i-2) + arr[i];
			int b = rec_opt(arr, i-1);
			return Math.max(a, b);
			}
	}

(2)动态规划法

public class sumMax {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {1, 2, 4, 1, 7, 8,3};
		System.out.println(dp_opt(arr));
	}
	
	/**
	 * 递归解法
	 * @param arr
	 * @param i
	 * @return
	 */
	public static int rec_opt(int[] arr, int i) {
		if(i == 0)
			return arr[0];
		else if (i == 1)
			return Math.max(arr[0], arr[1]);
		else {
			int a = rec_opt(arr, i-2) + arr[i];
			int b = rec_opt(arr, i-1);
			return Math.max(a, b);
			}
	}
	
	/**
	 * 动态规划解法
	 * @param arr
	 * @return
	 */
	public static int dp_opt(int[] arr) {
		int[] opt = new int[arr.length];
		opt[0] = arr[0];
		opt[1] = Math.max(arr[0], arr[1]);
		for(int i=2; i<arr.length; i++) {
			int a = opt[i-2] + arr[i];
			int b = opt[i-1];
			opt[i] = Math.max(a, b);
		}
		return opt[arr.length-1];
	}

}

题目总结:

相似文章和题目如下:

【1】【LeetCode】198. House Robber

【2】动态规划讲解视频:https://www.bilibili.com/video/av18512769/?spm_id_from=333.788.videocard.0

一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻 一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻: 可以用递归或者循环解决,现有数组arr[暂不舍定数量],最大不相邻数之和=maxsum,思路: 1、假如数组只有1 个值,那么maxsum1 = arr[0], 2、假如数组有2 个值,那么这个最大和maxsum2 = max(arr[0],arr[1]), 3、假如数组有3 个值,那么最大值肯定要么是arr[0]+arr[2],要么是arr[1],也就是maxsum3=max( arr[0]+arr[2] ,arr[1 阅读详情

相关推荐

LeetCode—House Robber 寻找数组不相邻组合最大值DP

https://leetcode.com/problems/house-robber/ 题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值 举一个例子 假设数据: 8 3 6 15 4 9 7 10 那么首先可能选取 8 , 3 每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合  8,3,14 到数字15,

xietingcandice的专栏 2449

求数组中不相邻数之和的最大值

[C++] 求数组中不相邻数之和的最大值(动态规划)

a1651950431的博客 1283

华为2288H V5服务器断电后‘趴窝’?别慌,手把手教你用SmartKit+BMC修复工具搞定

本文详细介绍了华为2288H V5服务器在断电后无法启动的修复方法,通过SmartKit和BMC修复工具进行故障诊断与修复。文章提供了从工具获取、安装到具体修复流程的完整指南,帮助运维人员快速恢复服务器运行,并给出了后续加固与预防措施,确保服务器稳定运行。

weixin_30575517的博客 297

求数组中不相邻的数和的最大值

题目:求数组中不相邻的数和的最大值。 例如:1,3,5,2,6 最大值是:5+6=11 #include <stdio.h> int a[5] = {1,3,5,2,6}; int max(int x,int y) { return x>y?x:y; } int main() { int i; int sum[5] = {0}; sum[0]=0; sum[1]=1; for.

4075

k8s部署 普罗米修斯(Prometheus)监控

Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。

D2961953033的博客 3855

解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题

在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1;

hanye2020的博客 3576

数组不相邻元素之和的最大值

数组不相邻元素之和的最大值 一、题目描述 今天下午面试老虎证券,被问到这题,当时脑子有点蒙,代码没写出来。这题的意思就是给你一个数组,让你计算元素的和,但是这些元素都不能相邻,求最大的和。其实这题很常见,在leetcode上面也有,但是原题是这样的: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束...

张康的博客 5886

Chapter 5 Gate Drivers and Level Shifters

Gate driver如下图所示, 包括功率管(带保护), Gate driver, Level shifter, Gate Supply 和Dead-time control.

2304_76736886的博客 2237

求不相邻的最大子数组和

问题1:给出一个数组,求出其中一个子集,使得子集中每个元素在原数组中两两都不相邻并使子集的和最大。 解法:对任意一个元素ai ,有两种可能: 选ai ,单选了ai 就不能选ai-1 ;不选ai 那么ai-1 可以选也可以不选,主要根据ai-2的情况,因此动态规划是这样设计的。  ds[i] 表示选i,a0....ai的最大子数组和; ns[i]表示不选择 i,a0 ....ai 的最大子数组

feiqiangs的专栏 1944

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 476

【图像识别】基于计算机视觉实现红绿灯识别matlab代码

​ 1 简介 现如今,盲人出行依旧是一大问题.面对无处不在的红绿灯,盲人无法通过眼睛辨识红绿灯的状态,出行受阻.为了解决盲人识别红绿灯的难题,本文提出了一种基于MATLAB进行红绿灯识别的系统.对交通灯的识别主要基于对交通灯的色彩及形状特征.基于信号灯的亮度对其进行分割,提取,并设置了一种自动最优选择阈值的方法.再由HIS彩色空间的H信息识别颜色.最后根据二值化的交通灯的横坐标和纵坐标方向的投影进行形状匹配识别. 2 部分代码 clc clear all close all a=imread('m

qq_59747472的博客 2690

记录---求数组中不相邻元素的最大和(动态规划)

输入一个只含正数的数组,找到数组满足条件的元素的最大和,条件是:组成最大和的所有元素不能相邻,比如输入数组[1 2 4 1 7 8 3],返回15(1+4+7+3) import java.util.Scanner; /** * 数组中不相邻数字相加最大和 * */ public class DP1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Stri

qq_37021992的博客 1848

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。GA-T 1400中的步骤如下:这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话,我们直接返回成功,不进行验证。如果需要鉴权的话可看我的另外一篇文档。

qq_37716298的博客 1044

动态规划求不相邻的最大子数组和

#include"iostream" #define max(a,b)a>b?a:b using namespace std; main() { int a[100]; int i,j,n; int dp[100]; cout cin>>n; cout for(i=0;i {  cin>>a[i]; }      dp[1]=max(a[0],a[1]);  for

心有多远 就能走远 只要你想 2997

Python爬虫实战:如何从Google Maps和OpenStreetMap抓取地理坐标数据

地点名称:地理位置的名称或地址。地理坐标:经度和纬度。类别信息:比如餐馆、商店、公园等。评论数据:如果可用,获取用户评论。本文介绍了如何使用Python爬虫从Google Maps和OpenStreetMap抓取地理坐标数据,并展示了如何存储和分析这些数据。通过实际的代码示例,您可以学习到如何处理不同类型的地图数据抓取任务,以及如何应对反爬虫机制。掌握这些技术后,您可以进行更广泛的地理数据分析,提供更有价值的地理信息服务。

2201_76125261的博客 1039

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

用一道算法题入门动态规划——求最大不相邻数组子元素和

典型的动态规划问题,可以采用递归和非递归两种方式来做。 问题:有一个数组,例如int[]arr=new int[]{4,1,1,9,7},求最大不相邻元素和。 分析:这里有两种可能,选择最后一个元素或者不选择最后一个元素,如果选择arr[4]=7,那么结果为arr[4]+opt(2),其中opt(i)为前i个元素的最大和。如果不选择最后一个元素,则结果为opt(3),即{4,1,1,9}中的...

waS_TransvolnoS的博客 543

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

动态规划 求数组中不相邻元素的最大和

有一个数组:arr = [1, 2, 4, 1, 7, 8, 3] 找出相加最大的和,选择的数不能相邻 该数组解为 1,4,7,3 和为15 题解: b站视频讲解 https://www.bilibili.com/video/BV12W411v7rd?from=search&seid=16185215057279292603 从最后一个来是按照递归的思想,动态规划的思想是从数组的第三个元素开始,选或不选,然后求最大值,将值赋给opt数组,如此循环直到arr数组的最后一个,结束,返回op.

柒哥的博客 1506

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode1716数组中不相邻数据和的最大值

联结 dp[i]为0-i数组中不相邻数据的最大值,对于i个数据可以取也可以不取,若取的话则值为 dp[i-2]+nums[i],若不取的话则dp[i-1]则状态转移方程dp[i]=Max(dp[i-1],dp[i-2]+nums[i]);初始值dp[0]=nums[0],dp[1]=Max(nums[0],nums[1]) package BDyNamicProgramming; /** ...

ZHOUJIAN_TANK的博客 1348

不相邻的最大子数组和

不相邻的最大子数组和问题描述给一个数组,数组元素为不小于零,求和最大的子数组,其中每个元素在原数组中不相邻。解题思路刚拿到题目可能隐约觉得是个dp问题,求前i个元素的最大子数组和,但还是有点手足无措,关键是将问题分情况讨论:前i个元素的最大子数组包含第i个元素和不包含第i个元素。 包含第i个元素,则一定不能包含第i-1个元素,包含第i个元素的最大子数组为不包含第i-1个元素的最大子数组和加上第i个元

lly的总结与分享 1452

动态规划第二讲:一个数组,找出一组不相邻的数字,使找出的数字的和最大

一组数字,找出一组不相邻的数字,使最后的和最大。 在一个数组arr中,找出一组不相邻的数字,使得最后的和最大。 分别用递归解法和动态规划解法 package com.study.dynamicprogromming; /** * @date 2020/7/27 * 一个数组,找出一组不相邻的数字,使最后的和最大,并返回最大值: * 例如: * {1, 2, 4, 1, 7, 8, 3} * 返回: 15 */ public class Demo2 { public static vo

Brian的博客 1653

LeetCode (20) house robber (数组不相邻元素最大值)

题目描述You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent ho

3812

求解数组中不相邻元素之和的最大值(动态规划法)

有一道题是这样的:在一维数组arr中,找出一组不相邻的数字,使得最后的和最大。比如:有个数组arr为[1, 2, 4, 1, 7, 8, 3],那么最优的结果为 1 + 4 + 7 + 3= 15。解题思路:针对数组内的每个数字,都存在选和不选的两种情况。对于最后一个数字3,如果选了3,则8就不能选,再继续判断前两位,也就是7的情况。如果不选3,则直接判断前一位,也就是8的情况。每个数字都有选和不选两种可能,选取这两种情况中的最佳解。

cuisidong1997的博客 608

【动态规划与递归】02 (0/1背包问题)给定一个非负数组,求不相邻元素的最大和,典型的动态规划问题

文章目录典型例题:思路:递归思路:(自顶向下)非递归思路(自底向上)代码递归:自上而下动态规划 :自底向上 典型例题: 给定一个非负数组,求不相邻元素的最大和。如下列数组 arr[7] = { 1,2,4,1,7,8,3 },最大和是15 思路: 该题目可以转换成0or1背包问题, 递归思路:(自顶向下) 对于第七个数字来说:有两种可能, A:选arr[6]是最大和中的一个组成数,然后看arr[4...

兰斯兰斯 451

字节笔试 - 寿司最大价格 - 动态规划 - 数组不相邻数之和最大值

寿司题 - 数组不相邻数之和最大值 此题来自于朋友在字节的笔试, 同类题目可见leetcode 198题 House Robber. 给你一堆寿司 不能选相邻的盘子 然后要选出价格加起来最高的那些 print价格 举例 [9 1 4 3] 输出13 如果是[9 1 3 2 5] 输出17 从题目知道这题本质是给一组数组,求数组里不相邻元素的最大值和,也就是说,求最优解。 思路 最优解题目使用DP。 第一步是 **确定状态 **。 假设有10碟寿司,价格如下 寿司序列 [0] [1] [2] [

rickyoung0221的博客 451
上一篇: Linux中chown和chmod的用法
下一篇: 【LeetCode】53. Maximum Subarray
Microstrong0305
Microstrong0305 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄12年 6405粉丝 312原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值