連続最大積hdu 4567


れんぞくさいだいせき
時間制限:1000 ms
メモリ制限:32768 KB
HDU       ID:  4561
64ビット整数:Javaクラス名:
前の問題
実行結果統計ディスカッションの発行
次の問題
タイトルの説明
小明と彼の良い友达の小西は1つのゲームを游んで、コンピュータからランダムに1つの-2,0,2の3つの数からなる配列を生成して、しかも约束して、谁が先にこの配列の中である1段の连続要素の积み重ねの最大値を算出して、たとえ谁が胜っても!
たとえば、次のランダム配列があります.
2 2 0 -2 0 2 2 -2 -2 0 
この配列の多くの連続サブシーケンスの中で,2 2−2−2という連続サブシーケンスの積が最大であった.
今、明ちゃんはこの最大値を算出してください.
入力
1行目には、T組のデータが合計であることを示す正の整数Tが入力される(T<=200).
次のT組のデータは、各組のデータの最初の行にNを入力し、配列の要素の総個数(1<=N<=10000)を表す.
次に0,−2,2からなるN個の要素を入力し,要素間をスペースで区切る.
しゅつりょく
データのセットごとにCase数を出力します.
最終的な答えが0以下の場合は、0を直接出力します.
そうでなければ答えが2^xであればxを出力すればよい.
各グループのデータは1行を占め、具体的な出力フォーマットはサンプルを参照してください.
サンプル入力
2
2
-2 0
10
2 2 0 -2 0 2 2 -2 -2 0

サンプル出力
Case #1: 0
Case #2: 4

ソース
2013金山西山居クリエイティブゲームプログラム挑戦試合-再試合(2)
前の問題
実行結果統計ディスカッションの発行
次の問題
管理人QQ 153295823
考え方:この問題を見たばかりでdpだと思っていましたが、どうしても間違っていました.私が使っている方法は、
コミットを開始すると、過ぎてしまいますが、その後、コミット、タイムアウト、同じコード、知らない
バックグラウンドのデータに問題が発生したかどうか、インターネットで調べてみると、一つの考えが特別だ.
良いコード、参考にして(思想も特に簡単です)私のコードも貼り付けます
さあ、大神さん、ちょっと教えてください.
いくつかのグループのデータを考えて、みんなはテストして、結果を比較して、コードを探して
の誤り.
3
2 -2 2
3
-2  2 2
6
2 -2 2 -2 2 -2
6
-2 2 -2 2 -2 2
大神の:
#include 
int main()
{
    int T,n,a[10010],i,j,k,sum,MAX,flag;
    scanf("%d",&T);
    k=1;
    while(T--)
    {
        scanf("%d",&n);
        for (i=0; i0)
            {
                if (sum<0)
                {
                    sum=sum-1;
                }
                else
                    sum=sum+1;
            }
            else if (a[i]<0)
            {
                if (sum<0)
                {
                    sum=-sum+1;
                }
                else
                    sum=-sum-1;
            }
            else
                sum=0;
            if (sum>MAX)
            {
                MAX=sum;
            }
        }

        sum=0;
       for (i=n-1; i>=0; i--)
        {
            if (a[i]>0)
            {
                if (sum<0)
                {
                    sum=sum-1;
                }
                else
                    sum=sum+1;
            }
            else if (a[i]<0)
            {
                if (sum<0)
                {
                    sum=-sum+1;
                }
                else
                    sum=-sum-1;
            }
            else
                sum=0;
            if (sum>MAX)
            {
                MAX=sum;
            }
        }
        printf("Case #%d: %d
",k++,MAX); } return 0; }

 
   
   
  
 
  


#include
#include
int a[10000+1];
int main()
{
    int t,n,h=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int m,term=0,k=0,max=0,s=0;
        for(int i=0; imax)
                    max=term;
                if(term>max&&k==0)
                    max=term;
                if(k%2&&s>max)
                   max=s;
            }
        }
        printf("Case #%d: %d
",++h,max); } return 0; }


 
  
 
  
#include
#include
int a[10000+1];
int main()
{
    int t,n,h=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int m,term=0,k=0,max=0,s=0;
        for(int i=0; imax)
                max=term;
            if(k%2&&s>max)
                max=s;
        }
             term=0; k=0; s=0;
         for(int i=n-1; i>=0; i--)
        {
            if(a[i]==0)
            {
                term=0;
                k=0;
                s=0;
                continue;
            }
            if(a[i]==-2)
            {
                k++;
                s=0;
            }
            else s++;
            term++;
            if(k%2==0&&term>max)
                max=term;
            if(k%2&&s>max)
                max=s;
        }
        printf("Case #%d: %d
",++h,max); } return 0; }