每段0...0间的分开处理....用dp[2]记录当前的最优情况...dp[0]代表统计到当前位置所能得到最大的正数2的指数....dp[1]代表统计到当前位置所能得到的最小的负数的2的指数....
Program:
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define pi acos(-1.0)
#define ll long long
#define oo 1000000000
#define MAXN 10005
using namespace std;
int a[MAXN],dp[2];
int main()
{
int T,t,n,ans,i,j,k,p;
scanf("%d",&T);
for (t=1;t<=T;t++)
{
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
dp[0]=dp[1]=ans=0;
for (i=1;i<=n;i++)
{
k=1;
if (a[i]==0) dp[0]=dp[1]=0;
else
if (a[i]==2)
{
if (k==-1) dp[0]=0,k=-k;
dp[0]++;
if (dp[1]) dp[1]++;
}else
if (a[i]==-2)
{
p=dp[0];
if (dp[1]) dp[0]=dp[1]+1;
else dp[0]=0;
dp[1]=p+1;
k=-k;
}
ans=max(ans,dp[0]);
}
printf("Case #%d: %d\n",t,ans);
}
return 0;
}