サブストリング和

1554 ワード

サブストリング和
時間制限:
5000 ms|メモリ制限:
65535 KB
難易度:
3
説明
整数数列{a 1,a 2...,an}が与えられ、1<=x<=y<=nのサブシーケンスの和が最大になるように、連続非空サブ列{ax,ax+1,...,ay}が見出される.
入力
1行目は整数N(N<=10)であり、テストデータのグループ数を表す.
各試験データの最初の行は、整数nがシーケンスにn個の整数を表し、その後の行にはn個の整数I(−100=しゅつりょく
各テストデータの出力と最大の連続サブ列の和.
サンプル入力
1
5
1 2 -1 3 -2

サンプル出力
5

ヒント
入力データが多いのでscanfでの入力をおすすめします
マイコード:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
	int N,n,i,j;
	int dp[1000010],a[1000010];
	scanf("%d",&N);
	while (N--)
	{
		scanf("%d",&n);
		for (i=0;i<n;++i)
		{
			scanf("%d",&a[i]);
		}
		dp[0]=a[0];
		for (i=1;i<n;++i)
		{
			if (dp[i-1]+a[i]>=0&&dp[i-1]>0)
			{
				dp[i]=dp[i-1]+a[i];
			}
			else
			{
				dp[i]=a[i];
			}
		}
		j=dp[0];
		for (i=1;i<n;++i)
		{
			if (j<dp[i])
			{
				j=dp[i];
			}
		}
		printf("%d
",j); } return 0; }

スレッド:
 
#include<stdio.h>
int main()
{
	int n,m,i,max,sum;
	scanf("%d",&n);
	while(n--)
	{
		max=0;
		scanf("%d",&m);
		scanf("%d",&sum);
		max=sum;
		while(--m)
		{
			scanf("%d",&i);
			if(sum<0) sum=i;
			else sum+=i;
			if(sum>max) max=sum;
		}
		printf("%d
",max); } }