[动态规划]求数组不相邻元素之和的最大值

 

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

题目描述

给定一个长度为n的数组,从其中任意选择不相邻的m个元素形成子数组,求这个子数组所有元素之和的最大值。

关于输入

输入包括两行。
第一行为一个正整数n(0<=n<=10000)。
第二行为n个整数,表示整个数组。

关于输出

输出一个数字,代表数组所有不相邻元素之和的最大值。

例子输入
5
1 2 3 4 5
例子输出
9
解题思路

这个程序是用来解决“求数组不相邻元素之和的最大值”问题的。它使用了动态规划的思想。

这个问题的具体描述是:给定一个长度为n的数组,从其中任意选择不相邻的元素形成子数组,求这个子数组所有元素之和的最大值。

程序的主要思路如下:

  1. 首先,程序读取一个整数n,然后读取n个整数,存储在数组num中。

  2. 然后,程序初始化一个二维数组dpdp[i][j]表示从ij(包括ij)的子数组中,所有不相邻元素之和的最大值。

  3. 程序遍历所有可能的子数组长度(从1到n)。对于每一个子数组长度,程序遍历所有可能的子数组的起始位置。

    • 如果子数组长度为1,那么dp[i][j]就等于num[i],因为子数组只有一个元素。

    • 如果子数组长度大于1,但是结束位置j小于2,那么dp[i][j]就等于num[i]num[j]中的较大值,因为子数组只有两个元素。

    • 如果子数组长度大于2,那么dp[i][j]就等于dp[i][j-2] + num[j]dp[i][j-1]中的较大值。这是因为,如果选择了j位置的元素,那么j-1位置的元素就不能选择,所以最大和就是dp[i][j-2] + num[j];如果不选择j位置的元素,那么最大和就是dp[i][j-1]

  4. 最后,dp[0][n-1]就是整个数组中,所有不相邻元素之和的最大值。

这个程序的时间复杂度是O(n^2),因为它需要遍历所有可能的子数组。如果数组的大小非常大,那么这个程序可能会运行得比较慢。

#include <iostream>
using namespace std;

int num[10001];
int dp[10001][10001];

int main() {
    int n; cin>>n;
    for(int i=0;i<n;i++){
        cin>>num[i];
    }
    for(int len=1;len<=n;len++){
        for(int i=0;i<n;i++){
            int j=i+len-1;
            if(len==1){
                dp[i][j]=num[i];
            }
            else if(j<2){
                if(j==1){
                    dp[i][j]=max(num[i],num[j]);
                }
            }
            else{
                dp[i][j]=max(dp[i][j-2]+num[j],dp[i][j-1]);
            }
        }
    }
    cout<<dp[0][n-1]<<endl;
	return 0;
}
进一步的优化

这个问题实际上可以使用一维动态规划来解决,这样可以将时间复杂度从O(n2)O(n2)降低到O(n)O(n)。

我们只需要一个一维的dp数组,dp[i]表示考虑到第i个元素时,所有不相邻元素之和的最大值。

对于每个元素,我们有两个选择:选择这个元素,或者不选择这个元素。

  • 如果我们选择这个元素,那么我们不能选择前一个元素,所以最大和就是dp[i-2] + num[i]

  • 如果我们不选择这个元素,那么最大和就是dp[i-1]

所以,dp[i]就等于上述两个值中的较大值。

#include <iostream>
#include <algorithm>
using namespace std;

int num[10001];
int dp[10001];

int main() {
    int n; cin>>n;
    for(int i=0;i<n;i++){
        cin>>num[i];
    }
    dp[0] = num[0];
    dp[1] = max(num[0], num[1]);
    for(int i=2;i<n;i++){
        dp[i] = max(dp[i-2] + num[i], dp[i-1]);
    }
    cout<<dp[n-1]<<endl;
    return 0;
}
用记忆搜索法加递归解决本问题!
#include <iostream>
#include <algorithm>
using namespace std;

int num[10001];
int dp[10001]={0};

int getmax(int n){
    if(dp[n]) return dp[n];
    if(n==0) return num[0];
    if(n==1) return max(num[0],num[1]);
    dp[n]=max(getmax(n-1),getmax(n-2)+num[n]);
    return dp[n];
}

int main() {
    int n; cin>>n;
    for(int i=0;i<n;i++){
        cin>>num[i];
    }
    cout<<getmax(n)<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/231379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五月天“假唱”争议持续升温,歌迷期待真实音符背后的真实交代

在12月3日的夜晚&#xff0c;“五迷”们心中的星辰仿佛黯淡了几分。在社交媒体上&#xff0c;关于五月天演唱会假唱的争论愈演愈烈&#xff0c;歌迷们的心情变得异常复杂。他们愤怒&#xff0c;是因为自己的偶像受到了质疑&#xff1b;他们伤心&#xff0c;是因为可能的假唱让他…

Java基础-开发流程以及HelloWorld程序

目录 1. Java的开发流程2. HelloWorld 1. Java的开发流程 开发Java程序&#xff0c;需要三个步骤&#xff1a;编写代码&#xff0c;编译代码&#xff0c;运行代码 2. HelloWorld 编写代码 public class HelloWorld {public static void main(String[] args) {System.out.pri…

Numpy自定义功能函数 np.apply_along_axis()(第14讲)

Numpy自定义功能函数 np.apply_along_axis()(第14讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

生日备忘录(自定义排序)

题目&#xff1a; 实现简易的生日备忘录。温暖的亲情是前进的动力&#xff0c;别忘记在家人生日时送 去祝福。定义类 Member 描述家庭成员&#xff0c;每位家人有自己的姓名 name 和出生日期 birthday&#xff0c;出生日期应描 述为由 year、month、day 组成的 Date 类。在 ma…

应用商店ASO优化提升APP排名的6大策略

ASO优化基操你了解多少&#xff1f; ASO优化对于APP推广运营来说是必不可少的一个方法。在当今竞争激烈的应用程序市场中&#xff0c;ASO&#xff08;App Store Optimization&#xff09;优化已成为提升APP排名和曝光度的关键因素。 一、ASO优化的重要性 ASO优化有助于提高AP…

【每周一测】Java阶段四第三周学习

目录 1、关于分布式锁的说法&#xff0c;错误的是&#xff08; &#xff09; 2、JDK动态代理产生的代理类和委托类的关系是 3、下列关于ElasticSearch中基本概念描述错误的是 4、Spring Cloud 中&#xff0c;Feign 是什么&#xff1f; 5、在JavaScript中&#xff0c;可以使…

Esxi7Esxi8设置VMFSL虚拟闪存的大小

Esxi7Esxi8设置VMFSL虚拟闪存的大小 ESXi7,8 默认安装会分配一个 VMFSL(VMFS-L)(Local VMFS)很大空间(120G), 感觉很浪费, 实际给 8G 就可以了, 最少 6G , 经实验,给2G没法安装 . Esxi7是虚拟闪存的 修改的方法是: 在安装时修改 设置 autoPartitionOSDataSize8192 在cdromBoo…

UI自动化测试框架:PO 模式+数据驱动

1、PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 PO 模式的设计思想与…

leetcode 1466

leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线&#xff0c;都需要修改&#xff0c;反之&#xff0c;如果是通向0的节点&#xff0c;例如节点4&#xff0c;则把节点4当作父节点的节点&…

【优选算法系列】【专题二滑动窗口】第四节.30. 串联所有单词的子串和76. 最小覆盖子串

文章目录 前言一、串联所有单词的子串 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、最小覆盖子串 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

【外观模式】SpringBoot集成mail发送邮件

前言 发送邮件功能&#xff0c;借鉴 刚果商城&#xff0c;根据文档及项目代码实现。整理总结便有了此文&#xff0c;文章有不对的点&#xff0c;请联系博主指出&#xff0c;请多多点赞收藏&#xff0c;您的支持是我最大的动力~ 发送邮件功能主要借助 mail、freemarker以及rocke…

UML案例分析

首先需要花大约20分钟来思考解决这个问题&#xff0c;如果对问题不是很熟悉&#xff0c;也可以在完成题目之后&#xff0c;找相关的资料翻阅&#xff08;例如看UML类图的基本情况&#xff0c;UML状态图的基本情况&#xff0c;然后结合这些信息 做一个自我评价&#xff0c;看这个…

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

51单片机的时钟电路与时序以及 复位电路和电源模式

51单片机的时钟电路与时序以及 复位电路和电源模式 本文主要涉及51单片机的时钟电路以及相关时序的知识&#xff0c;也讲解了了51单片机的复位电路以及电源模式。 文章目录 51单片机的时钟电路与时序以及 复位电路和电源模式一、时钟电路与时序1、 时钟电路设计1.1 内部时钟方式…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑垃圾处理与调峰需求的可持续化城市多能源系统规划》

这个标题涵盖了城市多能源系统规划中的两个重要方面&#xff1a;垃圾处理和调峰需求&#xff0c;并强调了规划的可持续性。 考虑垃圾处理&#xff1a; 含义&#xff1a; 垃圾处理指的是城市废弃物的管理和处置。这可能涉及到废物分类、回收利用、焚烧或填埋等方法。重要性&…

IOday7作业

1> 使用无名管道完成父子进程间的通信 #include<myhead.h>int main(int argc, const char *argv[]) {//创建存放两个文件描述符的数组int fd[2];int pid -1;//打开无名管道if(pipe(fd) -1){perror("pipe");return -1;}//创建子进程pid fork();if(pid &g…

Linux信息收集

Linux信息收集 本机基本信息 #管理员 $普通用户 之前表示登录的用户名称&#xff0c;之后表示主机名&#xff0c;再之后表示当前所在目录 / 表示根目录 ~表示当前用户家目录1、内核&#xff0c;操作系统和设备信息 uname -a 打印所有可用的系统信息 uname -r 内核版本 u…

scala安装使用教程_一篇搞定!

1、Scala高级语言 1.1 Scala简介 Scala是一门多范式&#xff08;multi-paradigm&#xff09;的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala运行在Java虚拟机上&#xff0c;并兼容现有的Java程序。 Scala源代码被编译成Java字节码&#…

解读Stable Video Diffusion:详细解读视频生成任务中的数据清理技术

Diffusion Models视频生成-博客汇总 前言:Stable Video Diffusion已经开源一周多了,技术报告《Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets》对数据清洗的部分描述非常详细,虽然没有开源源代码,但是博主正在尝试复现其中的操作。这篇…

DSP处理器及其体系结构特点(您都用过哪些DSP?)

DSP处理器概述 数字信号处理器&#xff08;Digital Signal Processor&#xff0c;DSP&#xff09;是一种专门设计用于执行数字信号处理任务的微处理器类型。与通用微处理器&#xff08;如CPU&#xff09;相比&#xff0c;DSP处理器在处理数字信号时具有更高的性能和效率。 用途…
最新文章