1050 循环数组最大子段和
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

 收藏
 关注

N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。

Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数 (-10^9 <= S[i] <= 10^9)
Output
输出循环数组的最大子段和。
Input示例
6
-2
11
-4
13
-5
-2
Output示例
20【代码】:
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<stack>
#define maxn 1005
#define maxm 50005
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;int n;
ll a[maxm];//一种是最大值没有过界,那么就是最大连续子段和
ll Max(int n)
{ll dp[maxm];dp[0]=0;ll ans=0;for(int i=1;i<=n;i++){if(dp[i-1]>0) dp[i]=dp[i-1]+a[i];else dp[i]=a[i];ans=max(ans,dp[i]);}return ans;
}//另一种是过界了,这时候我们可以转换一下思路,要求过界的最大连续子段和--->我们可以求不过界的最小连续子段和,这样剩下的数字和不但是最大的并且是过界连续的。
//总和-不过界最小连续子段和 23 5 -9 -18 -7 6
ll Min(int n)
{ll dp[maxm];dp[0]=0;ll ans=0;for(int i=1;i<=n;i++){if(dp[i-1]<0) dp[i]=dp[i-1]+a[i];else dp[i]=a[i];ans=min(ans,dp[i]);}return ans;
}int main()
{scanf("%d",&n);ll sum=0;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);sum += a[i];}printf("%lld\n",max(Max(n),sum-Min(n)));return 0;
}

转载于:https://www.cnblogs.com/Roni-i/p/8934238.html

51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】相关推荐

  1. 51nod 1050循环数组最大字段和

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 思路解析:一开始想着直接将长度为n的数组延长至2n-1 ...

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

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

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

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

  4. 【51Nod - 1270】数组的最大代价(dp,思维)

    题干: 数组A包含N个元素A1, A2......AN.数组B包含N个元素B1, B2......BN.并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi.数组A的代价定义如下 ...

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

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

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

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

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

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

  8. 一维循环数组最大子数组求解

    #include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) {int i, ...

  9. php环行队列实现,java数组实现队列及环形队列实现过程解析

    这篇文章主要介绍了java数组实现队列及环形队列实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码内容 ArrayQueue---用数 ...

最新文章

  1. 作为谷歌开发者布道师,我为什么要写这本通俗的《数据压缩入门》(一)
  2. 成为顶级CIO ,应该怎么做?
  3. python 代码-代码的重试机制(python简单实现)
  4. 快速幂(二进制,十进制)
  5. Outlook Express设置方法
  6. 怎么判断linux22端口是否通,在Linux环境下使用SSH判断端口是否通(示例代码)
  7. Python案例:通过方向键移动屏幕上的图像
  8. 计算机一级学科评选,我系力学被评选为一级学科国家重点学科
  9. pandas库基础笔记
  10. 平肝息风药题库【1】
  11. 360漏洞修复的提取
  12. 语音验证码接口(JSP)语言
  13. Excel中3个超级好用的条件求和的函数
  14. 中间选民定理(迭代剔除劣势策略,换位思考)
  15. GitHub个人Blog完全攻略
  16. strtok函数源码
  17. 贵州杰赛s65机顶盒子CPU S905M-B 刷机教程及纯尽版固件
  18. 3D游戏建模师职业现状:大学生毕业就是失业,真的这么可怕吗
  19. CAD编辑器中CAD线型怎么修改?
  20. RGB图像中特定颜色的提取

热门文章

  1. 查找子字符串----KMP算法深入剖析
  2. Sonar+Hudson+Maven构建系列之三:安装Hudson
  3. kd-Tree 【专题@AbandonZHANG】
  4. 【转】socket提交http表单 [C++]
  5. NNIE模型转换环境搭建
  6. 锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制
  7. [JOYOI] 自然数拆分Lunatic版
  8. Linux unit 5
  9. Node.js---02、node.js 模块加载机制
  10. OEA中的AutoUI重构(1) - Command自动生成