NYOJ 44-子串和(經典DP)
阿新 • • 發佈:2019-02-14
子串和
時間限制: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; }