九度oj 题目1372:最大子向量和(连续子数组的最大和)

题目描述:

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

输入:

输入有多组数据,每组测试数据包括两行。

第一行为一个整数n(0<=n<=100000),当n=0时,输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000])。

输出:

对应每个测试案例,需要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。

样例输入:
3
-1 -3 -2
5
-8 3 2 0 5
8
6 -3 -2 7 -15 1 2 2
0
样例输出:
-1 0 0
10 1 4
8 0 3

一开始代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 int n;
 8 int num[100002];
 9
10 int main(int argc, char const *argv[])
11 {
12     //freopen("input.txt","r",stdin);
13     while(scanf("%d",&n) != EOF && n != 0) {
14         for(int i = 0; i < n; i++) {
15             scanf("%d",&num[i]);
16         }
17         int maxx = -1002, cnt = 0;
18         int s = 0, state = 0;
19         int st = 0, et = 0;
20         for(int i = 0; i < n; i++) {
21             if(state == 0) {
22                 s = i;
23                 state = 1;
24             }
25             cnt = cnt + num[i];
26             if(cnt > maxx) {
27                 maxx = cnt;
28                 st = s;
29                 et = i;
30             }
31             if(cnt < 0) {
32                 cnt = 0;
33                 state = 0;
34             }
35         }
36         printf("%d %d %d\n",maxx,st,et);
37     }
38     return 0;
39 }

中间判断有些复杂,参考了一下别人的,修改如下

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 int n;
 8 int num[100002];
 9
10 int main(int argc, char const *argv[])
11 {
12     //freopen("input.txt","r",stdin);
13     while(scanf("%d",&n) != EOF && n != 0) {
14         int maxx = -1002, cnt = 0;
15         int s = 0;
16         int st = 0, et = 0;
17
18         for(int i = 0; i < n; i++) {
19             scanf("%d",&num[i]);
20
21             if(cnt >= 0) {
22                 cnt = cnt + num[i];
23             }
24             else {
25                 cnt = num[i];
26                 s = i;
27             }
28             if(cnt > maxx) {
29                 maxx = cnt;
30                 st = s;
31                 et = i;
32             }
33         }
34
35         printf("%d %d %d\n",maxx,st,et);
36     }
37     return 0;
38 }

时间: 2024-10-18 14:50:05

九度oj 题目1372:最大子向量和(连续子数组的最大和)的相关文章

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

剑指offer系列源码-最大子向量和(连续子数组的最大和)

题目1372:最大子向量和(连续子数组的最大和) 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2169解决:570 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)

最大子数组问题(求连续子数组的最大和)

在<算法导论>第四章分治策略(Divider and Conquer)4.1节提出了最大子数组问题.其转化就是求数组a={1, -2, 3, 10, -4, 7 , 2, -5}中连续子数组的最大和. 对于这个问题,很容想到一种暴力求解的方法:简单地尝试对所有可能的的组合进行求和.对数组为n存在n*(n-1)/2中组合,然后对每个组合进行求和.即三个for循环遍历,求出数组中每一个子数组的和,最终求出这些子数组的最大的一个值.记Sum[i,...,j]为数组a中第i个元素到第j个元素的和(其中

求数组中任何连续子数组的最大和,并打印最大子数组(求开始和结束下标)

//计算数组中任何连续子数组的最大和,并打印最大子数组(求开始和结束下标) //思路:1:当数组元素全为0时,输出最大的那个负数 //      2:当数组有正有负时,i=0遍历数组,从大于0的那个元素开始,记录此时的下标为shart(最大子数组起始下标),从start开始遍历剩下的元素,若元素和num大于max的值则更新max, //    且将此时的下标赋值给end(最大子数组终止下标),当num小于0则说明后面出现的(如果出现)最大子数组不可能包含这些元素,所以退出内层循环,继续外层循环,

九度oj 题目1527:首尾相连数组的最大子数组和

题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr[n-1],arr[0],…,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选). 输入: 输入包含多个测试用例,每个测试用例共有两行,第一行是一个整数n(1=<n<=100000),表示数组的

九度OJ—题目1527:首尾相连数组的最大子数组和

题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],-arr[n-1],arr[0],-,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选). 输入: 输入包含多个测试用例,每个测试用例共有两行,第一行是一个整数n(1=<n<=100000),表示数组的

九度oj题目1009:二叉搜索树

题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出:                        如果序列相同则输出YES,否则输出NO 样