题目链接:戳一戳

题目:

做法:

首先要知道

不循环数组得最大子段和解法   戳一戳 链接

然后呢

循环数组的最大子段和有两种情况:

一是 和正常数组一样  求出最大字段和  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相关推荐

  1. 1050 循环数组最大子段和

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  2. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  3. 【51nod - 1050】循环数组最大子段和(dp)

    题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...

  4. 51Nod 1050 循环数组最大子段和

    有两种方式: 1.在首尾之间 2.在尾首之间 对于第一种直接来dp就好,第二种需要将其数组全部取负,然后取到其最大值(肯定是负数的最大值)然后dp即可,最后比较这两个答案谁比较大就输出哪个 1 #in ...

  5. 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...

  6. 循环数组的最大子段和

    问题描述: N个整数组成循环序列,求这个序列的最大子段和. 例如:-2   11  -4  13  -5  -2    ANSWER: 20 解决: 解决这个问题需要有求解最大子段和的基础. 循环数组 ...

  7. 循环数组最大字段和(51Nod-1050)

    题目 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a ...

  8. 【C++算法与数据结构学习笔记------用循环数组实现队列】

    照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...

  9. 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法

    题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...

  10. 约瑟夫问题的学习(基于循环链表)以及基于循环数组

    这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...

最新文章

  1. 03:Poor Herobrine 直接插入排序
  2. 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
  3. Unhandled event loop exception Item not added
  4. $dbms=mysql_Oracle dbms
  5. oracle19c的版本号_Windows10安装Oracle19c数据库详细记录(图文详解)
  6. Python 3.9.0 首个迭代版本发布了
  7. vue-touch不能上下滑动的问题【解决】
  8. 基于DEAP库的python进化算法--遗传算法实践--非线性函数寻优
  9. java - day006 - 构造方法
  10. 建模的计算机基础理论,数学建模基础理论
  11. JavaScript设计模式之“单例模式“
  12. 供应链金融系统建设的具体实施步骤
  13. java面试知识点总结
  14. java 创建word文件_java基于feemarker 生成word文档(超级简单)
  15. [20190727NOIP模拟测试9]单(single) 题解(树上dp)
  16. adobe xd_如何在Adobe XD中创建Finance App UI设计
  17. 业务流程管理包括什么
  18. 生最困难的不是努力,而是做出正确的抉择
  19. 名帖300 王铎 行书《行书帖选》
  20. python 做网站_怎么用python做网站

热门文章

  1. 常用html元素的取值和赋值方法总结
  2. JQuery AJAX处理页面返回的XML
  3. LSET与LREM结合删除list中特定索引的值
  4. idea面板右下角的切换分支找不到
  5. 【Leetcode】101. 对称二叉树
  6. java语言标识符的声明规范
  7. Python学习(24)--面向对象编程1
  8. 用lm()拟合回归模型
  9. Python 列表深浅复制详解
  10. Java 基础类库:System、Runtime、Object、Math、日期、时间