最大连续区间和C++

2023-10-27

        在求连续区间的最大和是一种动态规划的常见例题。

        那么如何能快速求算得一个长度为n的数组的最大连续区间和

        第一反应当然是,通过暴力计算每一个区间的和进而求其最大值。

                但时间复杂度到达了不可接受的O(n^2)...

        而比较好的算法如下:

#include<iostream>
using namespace std;
#define ll long long
#define endl '\n'

//#include <bits/stdc++.h>
ll A[10003];

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	//求连续区间最小:时间:O(n) 空间:O(n)
	ll len, temp, ans = 0, dp = 0;
	cin >> len;
	for (int i = 0; i < len; ++i)
	{
		cin >> A[i];				//输入数组第i个值temp=Arr[i]
		dp = max(A[i], A[i] + dp);	//以Arr[i]结尾的区间最大值
		ans = max(ans, dp);
	}
	cout << ans << endl;

	/*
		测试样例:
		9
		-3 8 -2 1 -6 8 1 0 -1
	*/
}

        显然,最大连续区间一定是以某个数为结尾的区间。

        不妨假设以A[i]结尾的最大连续区间和为dp[i]

        那么,我们只需要遍历原数组,比较A[i]以及A[i]+dp[i-1].

        (即,当dp[i-1]<0时,直接舍弃前面的区间,以A[i]做dp[i],反之连接上之前的区间即可)

       


        再退一步想,如果不查找区间位置,好像并没有存储数组的必要...

        此时直接用temp接受临时的A[i]即可。

#include<iostream>
using namespace std;
#define ll long long
#define endl '\n'

//#include <bits/stdc++.h>

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	//求连续区间最小:时间O(n) 空间O(1)
	ll len, temp, ans = 0, dp = 0;
	cin >> len;
	for (int i = 0; i < len; ++i)
	{
		cin >> temp;				//输入数组第i个值temp=Arr[i]
		dp = max(temp, temp + dp);	//以Arr[i]结尾的区间最大值
		ans = max(ans, dp);
	}
	cout << ans << endl;

	/*
		测试样例:
		9
		-3 8 -2 1 -6 8 1 0 -1
	*/
}

        以上代码运用了动态规划的思想,通过求算Arr[i]结尾的区间最大值dp[i]的最大值为原数组Arr[i]的最大连续区间和。并且舍弃了原来的数组...所以它只能求和不能求区间的位置


#include<iostream>
using namespace std;
#define ll long long
#define endl '\n'

//#include <bits/stdc++.h>
ll A[10003];

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	//求连续区间最小:时间:O(n) 空间:O(n)
	ll len, temp, ans = 0, dp = 0, left, right = 0;
	cin >> len;
	for (int i = 0; i < len; ++i)
	{
		cin >> A[i];				//输入数组第i个值temp=Arr[i]
		dp = max(A[i], A[i] + dp);	//以Arr[i]结尾的区间最大值
		if (dp > ans)
		{
			ans = dp;				//更新答案以及右区间
			right = i;
		}
	}
	cout << ans << endl;

	for (int i = right; i >= 0; --i)//寻找左区间位置
	{
		ans -= A[i];
		if (ans == 0)
		{
			left = i;
			break;
		}
	}
	cout << "最大连续区间为: [ " << left << " , " << right << " ]\n";

	/*
		测试样例:
		9
		-3 8 -2 1 -6 8 1 0 -1
	*/
}

        以上通过存储数组来查找区间位置:

         当然,除了动态规划的方法还有分治等方法,但总的来说dp便于理解。

        文章制作不易,有不对的还望斧正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大连续区间和C++ 的相关文章

随机推荐

  • Java中String类,StringBuffer类和StringBuilder类

    底层分析 1 String类 String类对象代表不可变的字符序列 其底层结构如下 public final class String implements java io Serializable Comparable
  • quartz定时任务详解

    开始 application quartz xml
  • 前端面试题总结

    1 this指向问题 1 以函数的形式 包括普通函数 定时器函数 立即执行函数 调用时 this 的指向永远都是 window 比如fun 相当于window fun 2 以方法的形式调用时 this 指向调用方法的那个对象 3 以构造函数
  • NTP协议介绍

    查看原作者 转载自 NTP协议介绍 2013 06 19 14 50 50 转载 SNTP协议原理 SNTP是简单网络时间协议 Simple Network Time protocol 的简称 它是目前Internet网上实现时间同步的一种
  • 【分布式】分布式事务:2PC

    分布式事务的问题可以分为两部分 并发控制 concurrency control 原子提交 atomic commit 分布式事务问题的产生场景 一份数据被分片存在多台服务器上 那么每次事务处理都涉及到了多台机器 可序列化 并发控制 定义了
  • HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

    HttpServer的特点 1 完全采用IOCP模型 实现真正的异步IO 高并发 高可靠 2 支持4G以上文件下载 3 支持断点续传 4 轻量级 体积小 服务器文件仅200多K 无任何依赖库 5 支持CGI网关 通过CGI xml可动态配置
  • 二进制补码运算

    二进制负数的在计算机中采用补码的方式表示 很多人很好奇为什么使用补码 直接使用原码表示多好 看上去更加直观和易于计算 然而事实告诉我们 这种直观只是我们人类的一厢情愿罢了 在计算机看来 补码才是它们最想要的 那么 为什么计算机使用补码更好
  • Flask对数据库的增删改查

    一 从数据库获取数据返回 在配置好连接数据库的文件后 编写类视图 定义get方法 使用marshal返回数据 class SubResorce Resource def get self ret Sub query all return m
  • IDEA上传项目提示Push rejected: Push to origin/master was rejected的解决办法

    idea中 发布项目到码云 push 提示 push to origin master war rejected 解决方案如下 切换到自己项目所在的目录 右键选择git bash here 在窗口中依次输入命令 git pull git p
  • DVWA靶场实战

    提示 本文主要讲解DVWA靶场的主要功能和用处 简单的了解并学习DVWA靶场实战 不断地更新 一 DVWA靶场的功能介绍 DVWA共有十个模块 分别是 Brute Force 暴力 破解 Command Injection 命令行注入 CS
  • 输出字符串的子串

    我们经常碰到这样一个问题 怎样快速输出一个字符串的子串 这种问题通常有两种形式 1 输出连续子串 例如 假设字符串的长度为n 其非空子串的数目为你n n 1 2个 例如字符串 abc 的连续子串有 a b c ab bc abc 利用代码实
  • Flink 1.10编译实战(CDH版本)

    Flink1 10增加了一些新的特性 Flink 1 10 0 正式宣告发布 作为 Flink 社区迄今为止规模最大的一次版本升级 Flink 1 10 容纳了超过 200 位贡献者对超过 1200 个 issue 的开发实现 包含对 Fl
  • mysql组内排序

    比如说要获取班级的前3名 oracle 可以用 over partition by 来做 mysql就可以用GROUP CONCAT GROUP BY substring index实现 考试表 DROP TABLE IF EXISTS t
  • NLP:nltk+stanfordNLP

    1 NLTK import nltk form nltk book import 2 NLTK中使用stanfordNLP http www zmonster me 2016 06 08 use stanford nlp package i
  • SpringCloud Alibaba史上最强详解与史上最系统框架搭建

    框架实现代码资源地址 springCloud dataservice bus zip springcloudalibaba搭建 Java文档类资源 CSDN下载 目录 一 官网集合 Springboot官网 中文文档 Mybatis官网 S
  • TCP与UDP(非常详细)

    笔记记录 目录 前言 TCP UDP TCP UDP 区别 总结 前言 TCP IP模型是一些列协议的总称 TCP UDP IP FTP HTTP ICMP SMTP 这些协议可以划分为四层 链路层 网络层 传输层 应用层 TCP和UDP都
  • Oracle 11g客户端连接Oracle 12c服务器错误 ORA-28040

    问题描述 oracle服务器端版本 oracle 12 2 0 1 0 oracle客户端版本 oracle 11 2 0 1 0 在客户端访问oracle 12c提示如下错误 sqlplus scott scott 192 168 100
  • JSON是什么?如何正确理解?

    1 背景介绍 什么是JSON JSON JavaScript Object Notation JS 对象标记 是一种轻量级的数据交换格式 它基于 ECMAScript w3c制定的js规范 的一个子集 采用完全独立于编程语言的文本格式来存储
  • 遗传算法解释

    遗传算法是一种基于自然遗传和进化规律的人工智能算法 它通过模拟生物进化的过程 来解决各种复杂问题 遗传算法的基本流程如下 初始化 随机生成一些解作为初始种群 评估 评估每个解的适应度 根据适应度的高低决定哪些解具有更好的进化前景 交叉 选择
  • 最大连续区间和C++

    在求连续区间的最大和是一种动态规划的常见例题 那么如何能快速求算得一个长度为n的数组的最大连续区间和 第一反应当然是 通过暴力计算每一个区间的和进而求其最大值 但时间复杂度到达了不可接受的O n 2 而比较好的算法如下 include