説明
番号が番号を選択し、前記シーケンス、与えられたが、k個の連続番号が選択されている以上のものを持つことはできません。数字の合計を最大化するために選択しました。
解決
モノトーンキューDP +
Nは、シーケンス番号から採取した数、kよりペアワイズ数との間の距離、の最小化を考慮すると、抗困難です
次に、$ Fを定義する[i]は$ iが元の数、及び、その後明らかに状態遷移方程式が存在する(i番目のように注意)採取の最小数を表します。
$$ F [I] = \分\ {F [J] \} + [I] \クワッド(IK-1 \ルJ <I)$$
メンテナンスキュー単調で、連続している、と私が増加するとき、決定は前のセットの一部に重なるように許可され、転送が最も値が決定された回収期間を許可する決定の各I、Jのために、見つけることができます以下のように見えます、
時間の複雑さは$ O(n)は$です
コード
#include <ビット/ STDC ++ H> // それがオンラインと判定されたかどうかを確認 名前空間SHL { typedefは長い 長いLL。 インラインint型リード(){ int型 RET = 0、OP = 1 。 チャー C = GETCHAR()。 一方、(!isdigit(c)参照){ もし、(C == ' - ')OP = - 1 。 C = GETCHAR()。 } 一方(isdigit(c)参照){ RET = RET * 10+ C - ' 0 ' ; C = GETCHAR()。 } 戻りのRET *のオペアンプ。 } int型、N Mと、 [LL 100010 [F]、合計、100010 ]、QUE [ 100010 ]、H = 1、T = 1 、TOT。 INT (){メイン N =読み取る()、M = 読み取ります(); 用(登録をint i = 1 ; iが<= N; ++ i)は()[i]を読み出す= TOT + = A [i]は、 以下のために(登録int型 I = 1を; I <= N。++ I){ F [i]は = F [QUE [H]は+ [I]。 一方で(H <= T && F [i]が<= F [QUE [T])t-- 。 QUE [ ++ T] = I。 一方で(H <= T && QUE [H] <= I - M - 1)H ++ 。 } LL ANS = 0 。 用(登録intを ANS = STD :: MAX(ANS、TOT - - ++ I; iが<= N M I = N)[i]のF)。 printf(" %LLDする\ n " 、ANS)。 リターン 0 ; } } int型メイン(){ LOCALの#ifdef freopenは(" textname.in "、" R " 、STDIN)。 freopenは(" textname.out "、" W " 、STDOUT)。 #endifの )(SHL ::メイン。 リターン 0 ; }