环状数组最大子串和 最大和最小是相对的

要知道,最大和最小是相对的,用总和减去最小的就能得到最大的。     编程之美的题目没看懂,然后参考了http://zhangpeizhen.blog.163.com/blog/static/231873112201431784024921/

两种情况

1、普通数组,可以o(n)求最大子串和。

2、如果是环状,那么则要看到跨越 n-1 到 0 的这段环状的情况,要求这段最大的和,只需要用总和减去非环状的最小子串和即可。

然后取两种情况的最大值即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;

void dp() {
   int i,t1,t2;
   t1 = arra[0];
   t2 = arra[0];
   Max = t1;
   Min = t2;
   for( i = 1 ; i < n ; i ++)
   {
      if(t1 <= 0)
         t1 = arra[i];
      else
         t1 += arra[i];
      if(t2 >= 0)
         t2 = arra[i];
      else
         t2 += arra[i];
      Max = max(t1,Max);
      Min = min(t2,Min);
   }
   Max = max(Max,total-Min);
   printf("%d\n",max(Max,0));
}

int main() {
   while(~scanf("%d",&n))
   {
      total = 0;
      for(int i = 0 ; i < n ; i ++)
      {
         scanf("%d",&arra[i]);
         total += arra[i];
      }
      dp();
   }
   return 0;
}

但是我觉得少考虑了一种情况,比如全部为-1的数组,

普通数组最大子串和为-1,

按照上面求的最大的环状的必然为0,但是这样就是什么都不取的状态,

所以我觉得最后需要判断 是否 最小子串和 与 整个数组和 相等,如果相等说明就是上面考虑的情况,那么就取普通数组的的最大子串和就行了。

时间: 2024-07-29 08:17:42

环状数组最大子串和 最大和最小是相对的的相关文章

无序数组同时查找最大和最小的元素

在无序数组中查找最大或者最小的元素都需要进行n次比较,但是同时查找最大和最小的元素却可以在3n/2次比较内实现. 问题:给定一个长度为n的无序序列,同时查找出这个序列中的最大和最小值. 算法设计:如果只是在无序序列中查找最大或最小值,至少需要n-1次比较,但是同时查找出最大值和最小值却不需要2(n-1)次比较,而只需要3n/2次比较.其策略是:同时保存当前得到的最大值和最小值,之后依次从无序序列中取出两个数并进行比较,其中较小的一个与当前的最小值比较,较大的一个于当前的最大值比较,然后更新当前的

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

最大子数组和(环状数组)

一.题目: 返回一个整数数组中最大子数组的和. 二.要求:  输入一个整形数组,数组里有正数也有负数.  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.  如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.  同时返回最大子数组的位置.  求所有子数组的和的最大值.要求时间复杂度为O(n). 三.成员 主要的由付东和岳竞一一起共同结对开发完成. 付东主要负责程序分析,代码编程. 岳竞一责代码复审和代码测试计划.

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小. 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方法对这个数组进行第一次排序,排序得到的结果恰好是按字典序排序,而字典序又恰好是数字从0-9的顺序,恰好符合这个要求.最后进行检验下,有的可能需要调换下顺序使得数最小. package com.cn.qunar.test; /** * @author 刘利娟 [email protected] * @

脑洞题目 - 改自从一组无序数组中找不存在的最小正整数

无聊想的题目,但题目创意改自从一组无序数组中找不存在的最小正整数.并不难,但也有陷阱,比考虑0和负数... /** * 从无序数组中找不存在的最小正整数 * 我的要求:比如:{3,4,6,9,20}中 最小的不存在的正整数为2 */ #include <stdio.h> int main() { int arr[] = {-5, -10, 42, 29, 18, -3, 8, 20, -1}; int i, j, temp; for(i = 1; i < sizeof(arr)/size

求 一棵二叉树中权值最大和最小的叶节点之间的距离

#include <iostream> #include <vector> //结点的数据结构 struct Node { int _data; int _weight; Node* _left; Node* _right; Node(const int& x = 0,int weight=0) :_left(NULL) , _right(NULL) , _data(x) , _weight(weight) {} }; //建树 Node* CreateTree(const

FOJ 题目 2075 Substring (后缀数组求出现k次的最小字典序子串)

Problem 2075 Substring Accept: 70    Submit: 236 Time Limit: 1000 mSec    Memory Limit : 65536 KB Problem Description Given a string, find a substring of it which the original string contains exactly n such substrings. Input There are several cases.

410. Split Array Largest Sum 把数组划分为m组,怎样使最大和最小

[抄题]: Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. Note:If n is the length of array, as