列表

详情


DD8. 给定整数序列求连续子串最大和

描述

给定无序整数序列,求连续非空子串最大和,例如{-23 17 -7 11 -2 1 -34},子串为{17,-7,11},最大和为21

输入描述

输入为整数序列,数字用空格分隔,如:-23 17 -7 11 -2 1 -34

输出描述

输出为子序列的最大和:21

示例1

输入:

-23 17 -7 11 -2 1 -34

输出:

21

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2018-08-19

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int maxSubArray(int A[], int n) 
{  
    int sum = 0;
    int maxsum = A[0];
	int i;

	if (n <= 0) 
		return 0;
    for (i = 0; i < n; i++)
    {
        sum += A[i];
        if (sum > maxsum) maxsum = sum;
        if (sum < 0) sum = 0;
    }
    return maxsum;  
}

int main()
{
    char a[1024] = {0}, b[1024] = {0};
	int c[1024] = {0};
    int tmp = 0, N = 0, len = 0, i = 0;
    int maxsum = 0;
    gets(a);
	while (a[i] != 0) {
		if (a[i] == ' ') {
			memcpy(b, &a[i-len], len);
            c[N] = atoi(b);
			memset(b, 0, len);
            N++;
			len = 0;
			i++;
			continue;
		}
        len++;
        i++;
	}
	memcpy(b, &a[i-len], len);
    c[N] = atoi(b);
    
    maxsum = maxSubArray(c, N + 1);
    printf("%d\n", maxsum);
}

C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2021-08-10

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[1024];
    int n=0;
    while(1){
        scanf("%d", &a[n++]);
        if(getchar()=='\n')
            break;
    }
    int sum = a[0];
    int max = a[0];
    for(int i=1; i<n; i++)
    {
        if(sum<0) sum=a[i];
        else sum += a[i];
        if(sum>max) max=sum;
    }
    printf("%d", max);
}

C 解法, 执行用时: 2ms, 内存消耗: 312KB, 提交时间: 2021-09-10

#include <stdio.h>
#include <limits.h>

int main()
{
    int arr[1000];
    int index=0,num;
    while(scanf("%d",&arr[index++])!=EOF);
    int i,sum=0,max=INT_MIN;
    for(i=0;i<index-1;i++)
    {
        sum+=arr[i];
        if(sum>max)
            max=sum;
        if(sum<0)
            sum=0;
    }
    printf("%d\n",max);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2021-08-29

#include<stdio.h>
int main()
{
    int i=0,a[1000]={0},n,j,sum=0,max=-100;
    char c;
    while (scanf("%d",&a[i++])!=EOF)
    {
        if((c=getchar())=='\n') break;
    }
    n=i;
    for(i=0;i<n;i++)
    {
        sum=0;
        for(j=i;j<n;j++)
        {
            sum+=a[j];
            if(sum>max) max=sum;
            else if(sum<0)
            {
                sum=0;
                break;
            }
        }
    }
    printf("%d\n",max);
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-09-21

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int maxhe(vector<int>vc)
{
    int n=vc.size();
	if (n == 0)
		return -1;
	if (n == 1)
		return vc[0];
	int max = vc[0];
	int max1 = vc[0];
	for (int i = 1; i < n; i++)
	{
		if (vc[i]<max1 + vc[i])
		{
			max1 = max1 + vc[i];
		}
		else
		{
			max1 = vc[i];
		}
		if (max1>max)
			max = max1;
	}
	return max;
}
int main()
{
	vector<int>vc;
	int a;
	while (cin>>a)
	{
		vc.push_back(a);
		if (cin.get() == '\n')
			break;
	}
	int i=maxhe(vc);
	cout << i<<endl;
	return 0;
}

上一题