zoukankan      html  css  js  c++  java
  • 连续子数组的最大和

    题目描写叙述:

    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

    代码:

    /*
    连续子数组的最大和
    by Rowandjj
    2014/8/10
    */
    #include<stdio.h>
    #include<stdlib.h>
    bool isInvalid = false;
    int findMaxSumOfSubArray(int arr[],int len,int *begin,int *end)
    {
    	isInvalid = false;
    	if(arr == NULL || len <= 0)
    	{
    		isInvalid = true;
    	}
    	int curSum = 0;
    	int result = 0x80000000;//初始化为int最小值
    	int i;
    	
    	*begin = 0;
    	*end = 0;
    	int curBegin = 0,curEnd = 0;
    	for(i = 0; i < len; i++)
    	{
    		if(curSum < 0)
    		{
    			curSum = arr[i];
    			curBegin = i;
    			curEnd = i;
    		}
    		else
    		{
    			curSum += arr[i];
    			curEnd = i;
    		}
    		
    		if(curSum > result)
    		{
    			*begin = curBegin;
    			*end = curEnd;
    			result = curSum;
    		}
    	}
    	return result;
    }
    int main()
    {
    	int n;
    	while(scanf("%d",&n) != EOF)
    	{
    		if(n == 0)
    		{
    			break;
    		}
    		int *arr = (int*)malloc(sizeof(int)*n);
    		if(!arr)
    		{
    			exit(-1);
    		}
    		for(int i = 0; i < n; i++)
    		{
    			scanf("%d",arr+i);
    		}
    		int begin,end;
    		int result = findMaxSumOfSubArray(arr,n,&begin,&end);
    	
    		if(!isInvalid)
    		{
    			printf("%d %d %d
    ",result,begin,end);
    		}
    		free(arr);
    		arr = NULL;
    	}
    	return 0;
    }


  • 相关阅读:
    循环结构
    位运算符
    Switch 选择结构
    if结构和逻辑运算符
    变量和运算符
    [luogu1090 SCOI2003] 字符串折叠(区间DP+hash)
    [luogu2329 SCOI2005] 栅栏(二分+搜索)
    [luogu 4886] 快递员
    [luogu4290 HAOI2008]玩具取名(DP)
    [luogu2624 HNOI2008]明明的烦恼 (prufer+高精)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7196923.html
Copyright © 2011-2022 走看看