Kadaneアルゴリズム

Kadaneアルゴリズム

  連続シーケンス配列と最大値を求めます。

以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        数Nmax + = [I]。
        MAXX = MAX(MAXX、Nmax個)。
        数Nmax = MAX(Nmaxを、0 ); 
    }

A.フリッピングゲーム

説明

Iahubは飽きてしまったので、彼は紙の上でプレイされるゲームを発明しました。

彼曰く  、n個の  整数の  1、  2、...、  nとこれらの整数のそれぞれは、彼は正確に一つの動きを行うことを許可されています0または1のいずれかになります:彼は2つのインデックスを選択  I  及び  J  (1≤  iの  ≤  j個の  ≤の  n個の)すべての値を反転させ  、Kの位置が範囲内であるために  、[ I、  J ](つまり  、私は  ≤  k個の  ≤の  jで)。値フリップ  xが  操作適用することを意味し  、X  - = 1  Xを

ゲームの目的は、後ということです  正確に一つの動きものの最大数を取得します。Iahubの少しゲームを解決するためのプログラムを書きます。

入力

入力の最初の行は、整数含ま  N  (1≤  N  ≤100)を。入力の2行目にある  N  :整数  1、  2、...、  Nこれらの各ことが保証される  n個の  値が0または1のいずれかです。

出力

正確に一つの移動後に取得することができる1Sの最大数 - 整数を出力します。

入力

5
1 0 0 1 0

出力

4

正解:

常に私が書く方法をO(n)としたかったです

問題は、プロモーター配列、要件の最大数を反転すると言われています。

私たちは、-1、0、1、収益を返す1

、つまり、最大の利益のシーケンスを求めて最大サブシーケンスを求めます

最大の利益に加えて、元の番号1が答えです。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3 typedefの長い 長いLL。
4  のconst  int型 MAXN = 3000000 + 10 5  CONST LL INF = 1E17。
6  INT N。
7  INT [ 150 ]、YI、MAXX = - 999999 、Nmaxと;
8  INT メイン()
 9  {
 10      のscanf(" %d個"、&N)
11      のためのint型i = 1 ; iは= <N; iは++ 12      {
 13          のscanf(" %dの"、および[I])。
14          であれば([I] == 1 15          {
 16              YI ++ 17              [I] = - 1 18          }
 19          
20              [I] = 1 21      }
 22      のためのint型 I = 1は iが++; iがn = < 23      {
 24          Nmaxを+ =[I]。
25          MAXX = MAX(MAXX、Nmax個)。
26          数Nmax = MAX(Nmaxを、0 );
27      }
 28      のprintf(" %Dを\ n "、MAXX + YI)。
29  
30      戻り 0 ;
31 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Kaike/p/11270240.html