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 }