题目链接:http://soj.sysu.edu.cn/1091
动态规划
dp1[i]数组表示从左往右以i为终点最大连续和
dp2[i]数组表示从右往左以i为终点最大连续和
dp3[i]数组表示从右往左记录下到当前位置能取到的最大值,即记忆化,使调用该值不必再次循环
最终最大值_max = max(dp1[i] + dp3[i+1])
arr: 1,-1,2,2,3,-3,4,-4,5,-5
dp[1]: 1, 0,2,4,7, 4,8, 4,9, 4
dp[2]: 9, 8,9,7,5, 2,5, 1,5,-5
dp[3]: 9, 9,9,7,5, 5,5, 5,5,-5
MAX : 10,9,9,9,12,9,13,9,-4 X 故答案为13
注意考虑全为负数的情况!
scanf 比 cin快很多,此题用cin一定TLE!
#include<cstdio>
#include<iostream>
#define INF -2147483647;
using namespace std;
int arr[50001],dp1[50001],dp2[50001],dp3[50001];
int test,n,_max;
int main()
{
dp1[0] = 0;
scanf("%d",&test);
while(test--)
{
_max = INF;
scanf("%d",&n);
dp2[n+1] = 0;
for(int i = 1;i <= n;++i)
{
scanf("%d",&arr[i]);
dp1[i] = max(dp1[i-1] + arr[i],arr[i]);
}
int temp = INF;
for(int i = n;i > 1;--i)
{
dp2[i] = max(dp2[i+1] + arr[i],arr[i]);
if(dp2[i] > temp)
{
temp = dp2[i];
dp3[i] = dp2[i];
}
else
dp3[i] = temp;
if(dp3[i] + dp1[i-1] > _max)
_max = dp3[i] + dp1[i-1];
}
printf("%d/n",_max);
}
return 0;
}