1. 程式人生 > >NYOJ 44-子串和(經典DP)

NYOJ 44-子串和(經典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
//經典DP
//狀態轉移方程dp[i+1] = max(dp[i]+dp[i+1], dp[i+1])
//結果為dp陣列中最大的元素值cntmax;
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 1000005
using namespace std;

int dp[maxn];

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		memset(dp, 0, sizeof(dp));
		int n;
		scanf("%d", &n);
		for(int i=0; i<n; i++)
			scanf("%d", &dp[i]);
        int cntmax = dp[0];
		for(int i=0; i<n-1; i++)
		{
			dp[i+1] = max(dp[i]+dp[i+1], dp[i+1]);
			cntmax = max(cntmax, dp[i+1]);
		}
		printf("%d\n", cntmax);
	}
	return 0;
}