nyoj44最大字段和【dp】

子串和

时间限制: 5000 ms  |  内存限制: 65535 KB
难度: 3
描述
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
1
5
1 2 -1 3 -2
样例输出
5

                

#include<stdio.h>
#include<iostream>
#include<string.h>
int a[1000005];
int b[1000005];
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int ans=-1;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		b[0]=0;                                //设置前0个最大和为0
		for(int i=1;i<=n;i++)
		{
			if(b[i-1]>0)                     //b[i]  记录包含a[i]的a[1]---a[i]的最大和           
			{
				b[i]=b[i-1]+a[i];	
			}	
			else
			{
				b[i]=a[i];               //如果前面的小于0那么没必要加了因为负数加上任何数都会变得更小
			}
			if(ans<b[i])                        //ans记录b数组中的最大值
			{
				ans=b[i];
			}
			
		}
		printf("%d\n",ans);	
	}
	return 0;
	
 } 

猜你喜欢

转载自blog.csdn.net/qq_40816078/article/details/80599584