1. 程式人生 > >POJ2479->最大子串和變形

POJ2479->最大子串和變形

POJ2479->最大子串和變形

題意:求解一串數字中最大的兩個不相交子段和的和
思路:使用兩個陣列,dpl[i]儲存從1-i的最大子串和,dpr[i]儲存i-n的最大子串和,因此求不相交的兩個子串和的最大值
狀態轉移方程:
dpl[i] = max(num[i], num[i]+dpl[i-1]);
dpr[i] = max(num[i], num[i]+dpr[i+1]);

程式碼:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std; #define MAX 50010 #define INF 0x7f7f7f7f int dpl[MAX], dpr[MAX],num[MAX]; int n, ans; void DP() { dpl[1] = num[1]; dpr[n] = num[n]; for(int i = 2 ; i <= n ; i ++) { dpl[i] = max(num[i], num[i]+dpl[i-1]); } for(int i = 2 ; i <= n ; i ++) { dpl[i] = max(dpl[i], dpl[i-1
]); } for(int i = n ; i > 1 ; i --) { if(i < n) dpr[i] = max(num[i], num[i]+dpr[i+1]); if(ans < dpr[i]+dpl[i-1]) ans = dpr[i]+dpl[i-1]; } } int main() { int T; scanf("%d", &T); while(T --) { scanf("%d", &n); for
(int i = 1 ; i <= n ; i ++) scanf("%d", &num[i]); ans = -INF; DP(); printf("%d\n", ans); } return 0; }