最大子串和

来源:互联网 发布:留学生回国工作 知乎 编辑:程序博客网 时间:2024/05/21 17:08

给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。

输入

第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)

输出

对于每组测试数据输出和最大的连续子串的和。

样例输入

151 2 -1 3 -2

样例输出

5
该题求最大子串,可以把它分成n个子串然后求每一个子串的和再找出最大值。因为当前的状态与以前和以后的状态都无关,因此可以用dp。
把计算的每一个子串的结果保存在数组中,然后找最大值就行了。
#include<iostream>
#include<cstring>using namespace std;int a[1000010];int dp[1000010];int Dp(int n){    int i,j;    int max=-10000;    memset(dp,0,sizeof(dp));    for(i=0;i<n;i++)    {        for(j=0;j<=i;j++)        {            dp[i]+=a[j];        }        if(max<dp[i])            max=dp[i];    }    return max;}int main(){    int m,i;    int n;    cin>>m;    while(m--){        cin>>n;        for(i=0;i<n;i++)            cin>>a[i];        cout<<Dp(n)<<endl;    }    return 0;}
0 0