这是一个动态规划的题目。可以使用双DP。输入的时候可以使用一次DP。求出最大值。然后从后往前进行一次DP求出最大值就可以了。时间复杂度为O(N)。
具体代码实现如下:
具体代码实现如下:
- #include<iostream>
- using namespace std;
- int temp[50000],num[50000];
- const int MIN = -100000;
- int main()
- {
- int test,n;
- int tmp,ans,sum;
- scanf("%d",&test);
- while(test--)
- {
- scanf("%d",&n);
- tmp = MIN;
- sum = 0;
- for(int i=1;i<=n;i++)//第一次DP
- {
- scanf("%d",&num[i]);
- sum += num[i];
- if(sum>tmp)
- tmp = sum;
- temp[i] = tmp;
- if(sum<0) sum = 0;
- }
- tmp = ans = MIN;
- sum = 0;
- for(int i=n;i>1;i--)//第二次DP
- {
- sum += num[i];
- if(sum>tmp) tmp = sum;
- if(ans<(temp[i-1]+tmp))
- ans = temp[i-1]+tmp;
- if(sum<0) sum = 0;
- }
- cout << ans << endl;
- }
- return 0;
- }