这道题很有意思,很容易就会发生超时,这一点从它建议我们用scanf做输入就能猜出一二,毕竟它连cin都容不下。所以我们的算法要尽可能简单,不要涉及函数调用,调来调去的也很费时。
这道题用动态规划的思想
arr1[i] = max(arr1[i - 1] + list[i], list[i]);arr表示包括list[i]的元素连续最大值存到arr[i]中。
下面这个if语句表示arr中前i个元素的最大值存到arr[i]
if (arr1[i] < arr1[i - 1])
arr1[i] = arr1[i - 1];
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int m;
scanf_s("%d", &m);
while (m--)
{
int n;
scanf_s("%d", &n);
vector<int> list;
while (n--)
{
int k;
scanf_s("%d", &k);
list.push_back(k);
}
int sum = 0;
int maxnum = -999999999;
int * arr1 = new int[list.size()];
arr1[0] = list[0];
for (int i = 1; i < list.size(); i++)
{
arr1[i] = max(arr1[i - 1] + list[i], list[i]);
}
for (int i = 1; i < list.size(); i++)
{
if (arr1[i] < arr1[i - 1])
arr1[i] = arr1[i - 1];
}
reverse(list.begin(), list.end());
int * arr2 = new int[list.size()];
arr2[0] = list[0];
for (int i = 1; i < list.size(); i++)
{
arr2[i] = max(arr2[i - 1] + list[i], list[i]);
}
for (int i = 1; i < list.size(); i++)
{
if (arr2[i] < arr2[i - 1])
arr2[i] = arr2[i - 1];
}
reverse(arr2, arr2 + list.size());
/*for (int i = 0; i < list.size(); i++)
cout << arr2[i] << endl;*/
for (int i = 0; i < list.size() - 1; i++)
{
sum = arr1[i] + arr2[i + 1];
if (maxnum < sum)
maxnum = sum;
}
cout<<maxnum<<endl;
delete[] arr1;
delete[] arr2;
}
system("pause");
return 0;
}