POJ2479->最大子串和變形
阿新 • • 發佈:2019-02-17
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;
}