原题:https://codeforces.com/contest/1343/problem/C
官方题解:https://codeforces.com/blog/entry/76352
题意:t组测试样例,n个数,找长度最长且元素之和最大的交替子序列(第一要求是最长的交替子序列,然后才是元素之和最大)
一开始想到dp上去了(最近都在做这类题,感觉都快魔怔了),测试数据都是过了的,但是wal了,没想明白问题出在哪。
结束之后看到题目标签上有贪心,感觉自己把问题想复杂了,之后试着直接分成四种情况考虑,暴力求解,过了。
dp(wa)
#include <bits/stdc++.h>
using namespace std;
long long t,n,a[200010],l,x,dp[200010];
int main()
{
cin>>t;
for(int i=0; i<t; i++)
{
cin>>n;
x=0;
l=1;
memset(a,0,sizeof(a));
cin>>a[0];
// memset(dp,-1,sizeof(dp));
dp[1]=a[0];
for(int j=1; j<n; j++)
{
cin>>a[j];
// dp[j]=a[j];
if(a[x]*a[j]<0)
{
l++;
dp[l]=dp[l-1]+a[j];
x=j;
}
else
{
if(l>1)
dp[l]=max(dp[l],dp[l-1]+a[j]);
else
dp[l]=max(a[x],a[j]);
}
}
cout<<dp[l]<<endl;
}
}
暴力(ac)
#include <bits/stdc++.h>
using namespace std;
long long t,n,a,f,m,sum;
int main()
{
cin>>t;
for(int i=0; i<t; i++)
{
cin>>m;
cin>>n;
sum=0;
if(n<0)
f=-1;
else
f=1;
for(int j=1;j<m;j++)
{
cin>>a;
if(a<0&&f==-1)
n=max(n,a);
else
if(a<0&&f==1)
f=-1,sum+=n,n=a;
else
if(a>0&&f==1)
n=max(n,a);
else
if(a>0&&f==-1)
f=1,sum+=n,n=a;
}
sum+=n;
cout<<sum<<'\n';
}
}