循环数组最大子段和--51nod1050
题目链接:戳一戳
题目:
做法:
首先要知道
不循环数组得最大子段和解法 戳一戳 链接
然后呢
循环数组的最大子段和有两种情况:
一是 和正常数组一样 求出最大字段和 ans1
二是 最大字段和不连续 a1+a2=sum (后边+前边)
这个时候就要把中间那段求出来 用总和减去 才是最大子段和
那么我们当然希望中间那段的值越小越好了 最小得到的子段和才是最大
所以我们求这个数组的最小子段和 怎么求最小子段和呢?
(数组所有数字乘上 -1 然后按照求最大字段和的办法 求出最大字段和
再把结果乘-1 就是最小子段和了)
用总和减去求得的最小子段和 得到的就是第二种情况的最大子段和 ans2
由于我们并不确定是那种情况 所以我们两种都算出来 取其中大的那个
ans=max(ans1,ans2)
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
ll a[maxn];
ll b[maxn];
ll dp[maxn];
const ll INF=8e18;
ll n,sum;
int main(){scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);sum+=a[i];}for(int i=1;i<=n;i++)b[i]=-a[i];memset(dp,0,sizeof(dp));ll maxx=0;for(int i=1;i<=n;i++){dp[i]=max(a[i],dp[i-1]+a[i]);maxx=max(dp[i],maxx);//记录最大连续子段和}memset(dp,0,sizeof(dp));ll m=0;for(int i=1;i<=n;i++){dp[i]=max(b[i],dp[i-1]+b[i]);m=max(dp[i],m);}if(sum+m>maxx)maxx=sum+m;printf("%lld\n",maxx);
}
循环数组最大子段和--51nod1050相关推荐
- 1050 循环数组最大子段和
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 【51nod - 1050】循环数组最大子段和(dp)
题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...
- 51Nod 1050 循环数组最大子段和
有两种方式: 1.在首尾之间 2.在尾首之间 对于第一种直接来dp就好,第二种需要将其数组全部取负,然后取到其最大值(肯定是负数的最大值)然后dp即可,最后比较这两个答案谁比较大就输出哪个 1 #in ...
- 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...
- 循环数组的最大子段和
问题描述: N个整数组成循环序列,求这个序列的最大子段和. 例如:-2 11 -4 13 -5 -2 ANSWER: 20 解决: 解决这个问题需要有求解最大子段和的基础. 循环数组 ...
- 循环数组最大字段和(51Nod-1050)
题目 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a ...
- 【C++算法与数据结构学习笔记------用循环数组实现队列】
照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...
- 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法
题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...
- 约瑟夫问题的学习(基于循环链表)以及基于循环数组
这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...
最新文章
- 03:Poor Herobrine 直接插入排序
- 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
- Unhandled event loop exception Item not added
- $dbms=mysql_Oracle dbms
- oracle19c的版本号_Windows10安装Oracle19c数据库详细记录(图文详解)
- Python 3.9.0 首个迭代版本发布了
- vue-touch不能上下滑动的问题【解决】
- 基于DEAP库的python进化算法--遗传算法实践--非线性函数寻优
- java - day006 - 构造方法
- 建模的计算机基础理论,数学建模基础理论
- JavaScript设计模式之“单例模式“
- 供应链金融系统建设的具体实施步骤
- java面试知识点总结
- java 创建word文件_java基于feemarker 生成word文档(超级简单)
- [20190727NOIP模拟测试9]单(single) 题解(树上dp)
- adobe xd_如何在Adobe XD中创建Finance App UI设计
- 业务流程管理包括什么
- 生最困难的不是努力,而是做出正确的抉择
- 名帖300 王铎 行书《行书帖选》
- python 做网站_怎么用python做网站