//动态规划 //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; }