现在的位置: 首页 > 综合 > 正文

HDOJ – 4561/西山居复赛2 连续最大积

2013年02月03日 ⁄ 综合 ⁄ 共 737字 ⁄ 字号 评论关闭

     每段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;
}

抱歉!评论已关闭.