hdu 西山居 複賽2 求連續最大積

如果看到題目就往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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章