瞎搞的思想:
在-2出现奇数次的地方,将序列分成两部分;
注意序列正反各判断一次,去大值;
标准思路DP,未写!
#include<stdio.h> #include<string.h> int a[10010]; int main() { int _case,n; int i,j,k; int ne,po,por,ans,max; scanf("%d",&_case); for(i=1; i<=_case; i++) { memset(a,0,sizeof(a)); scanf("%d",&n); for(j=0; j<n; j++) scanf("%d",&a[j]); ne=0; po=0; por=0; ans=0; //max=0; for(j=0; j<n; j++) { //if(a[i]<0)ne++; if(a[j]) { if(!ne&&a[j]>0)po++; else { if(a[j]>0)por++; else ne++; } if(ne==2) { po+=por+2; ne=0; por=0; } //printf("%d %d\n",po,por); } else { if(por>po)po=por; if(po>ans)ans=po; ne=0; po=0; por=0; } } if(por>po)po=por; if(po>ans)ans=po; max=ans; ne=0; po=0; por=0; ans=0; //max=0; for(j=n-1; j>=0; j--) { //if(a[i]<0)ne++; if(a[j]) { if(!ne&&a[j]>0)po++; else { if(a[j]>0)por++; else ne++; } if(ne==2) { po+=por+2; ne=0; por=0; } //printf("%d %d\n",po,por); } else { if(por>po)po=por; if(po>ans)ans=po; ne=0; po=0; por=0; } } if(por>po)po=por; if(po>ans)ans=po; if(ans<max)ans=max; printf("Case #%d: %d\n",i,ans); } return 0; }