Description
小明有n个球排成一行,每个球上有个数字。现在小明选择两个球,使这两个球之间的数字和最大(包括这两个球)。如果这个最大的和不为正,则输出“Game Over”。
Input
第一行输入T,有T组数据。
每组数据:输入n(1<n<1000000 ),再输入n个整数,表示第1个球到第n个球上的数字,每个球上的数字大于-100,小于100。
Output
对于每组数据,输出最大和或者”Game Over“,占一行。
Sample Input
6 5 3 -5 7 -2 8 3 -1 2 3 4 -1 1 -111 1111 3 -1 -2 -3 3 1 -1 0 6 100 -1 -1 -1 -1 -1 -1
Sample Output
13 5 1001 Game Over Game Over 99
刚开始想用普通的dp做,但是写完了发现有个条件实现不了,就是元素个数一定要>=2。这道题和普通的求最大子序列和最大的区别就在于子序列的数字个数必须不少于2个!这算是这道题的一个难点,这里使用g++来判断子序列的元素个数是否少于2。
【通过代码】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 5;
int dp[maxn],a[maxn];
int main() {
int t,n;
cin>>t;
while(t--)
{
int g = 0;
memset(dp,0,sizeof(dp));
cin>>n;
int sum = 0,maxsum = -1000;
for(int i = 0 ; i < n;i ++)
{
cin>>a[i];
}
for(int i = 0 ; i < n;i ++)
{
g++;
sum += a[i];
if(sum < 0 && i < n - 2)
{
sum = 0;
g = 0;
}
if(sum > maxsum && g > 1)
maxsum = sum;
}
sum = 0;
g = 0;
for(int i = 0 ; i < n;i ++)
{
g++;
sum += a[n - 1 - i];
if(sum < 0 && i < n - 2)
{
sum = 0;
g = 0;
}
if(sum > maxsum && g > 1)
maxsum = sum;
}
if(maxsum <= 0)
cout<<"Game Over"<<endl;
else
cout<<maxsum<<endl;
}
return 0;
}
末尾附上普通的求最大子列和的函数,方便以后取用。 参考博客链接
int MaxSubSequence(const int A[], int N)
{
int ThisSum,MaxSum,j;
ThisSum = MaxSum =0;
for(j = 0;j < N;j++)
{
ThisSum += A[j];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}