如果看到题目就往dp上面想的话,先自己打脸>_<
这个根本和连续最大积没有任何关系
解题思路:以0为分割点把串分成有连续2或者-2的小串,然后计算每个小串中-2的个数,如果-2个数为偶数记录串的长度
如果-2个数为奇数,记录第一个-2和最后一个-2所在的位置,然后求的这两个位置分割成的串的最大长度,
正题下来,输出串的最大长度。
//Creat Time: 2013年05月25日 星期六 17时01分36秒
//File Name: XS21000.cpp
//--Author--: GreedyDaam
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")//设置栈大小
#define MAX 10010
using namespace std;
int input[MAX];
int find(int n){
int i,m=0,frist=0,last=0,len=0,count=0;
for(i=0;i<n;i++){
if(input[i]!=0){
len++;
if(input[i]==-2){
count++;
if(frist==0)frist=len;
last=len;
}
}
else{
if(count%2==0){
m=max(m,len);
}else{
m=max(m,max(frist-1,len-frist));
m=max(m,max(last-1,len-last));
}
count=0;frist=0;last=0;len=0;
}
}
if(input[n-1]!=0){
if(count%2==0){
m=max(m,len);
}else{
m=max(m,max(frist-1,len-frist));
m=max(m,max(last-1,len-last));
}
count=0;frist=0;last=0;len=0;
}
return m;
}
int main(){
freopen("input.txt","r",stdin);
int t,i,n,k=1;
scanf("%d",&t);
while(t--){
printf("Case #%d: ",k++);
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&input[i]);
}
printf("%d\n",find(n));
}
return 0;
}