ABC466 E - Range Flip

区間反転

考え方

問題を少し言いかえれば、これは単純な動的計画法の問題である。

カード列の $l$ 枚目から $r$ 枚目を裏返す操作をしていいとされている。
これは、実は、$l$ 枚目から右を全て裏返し、さらに $r+1$ 枚目から右を全て裏返すとも考えられる。
($r$ がカード列の右端の場合は、なにもしないことに相当する)

つまり、「あるカードから右を全て裏返す」を最大 $2K$ 回行って、最大値はいくつか?」を解けばよい。
厳密には偶数回限定であるが、何もしないに相当する操作も選べるため、実質的に奇数回も許される。

ということで、長さ $2K+1$ のテーブルを持ち、左から $1$ 枚ずつ見ながら更新していけばよい。
$i$ 番目のデータは、そこより左で反転を $i$ 回行った場合の最大値。
つまり、直前のデータの $i$ 回のデータと $i-1$ 回のデータの大きい方に、次のカードの値を足せばよい。

全てのカードを見終わった後で、テーブルの任意の位置にある値の最大値が答え。
計算量は $O(NK)$。

入力例1での動作

入力を受け取る。

n: 7
k: 2
a: {2, 6, 3, 9, 4, 7, 5}
b: {1, 9, 5, 2, 8, 3, 6}

$2K+1=5$ 個の状態を持つ DP テーブルを用意する。
最初は、境界を $0$ 回通過した状態だけを 0 とする。

dp: {0, -INF, -INF, -INF, -INF}

$1$ 枚目のカードを処理する。
各要素について、自身と $1$ つ前の要素の大きい方に、カードの値を足す。
境界通過回数が偶数なら a[0]、奇数なら b[0] を足す。

dp[0]: 0+2=2
dp[1]: max(-INF,0)+1=1
dp[2]: max(-INF,-INF)+2=-INF
dp[3]: max(-INF,-INF)+1=-INF
dp[4]: max(-INF,-INF)+2=-INF

dp: {2, 1, -INF, -INF, -INF}

$2$ 枚目のカードを処理する。
境界通過回数が偶数なら a[1]、奇数なら b[1] を足す。

dp[0]: 2+6=8
dp[1]: max(1,2)+9=11
dp[2]: max(-INF,1)+6=7
dp[3]: max(-INF,-INF)+9=-INF
dp[4]: max(-INF,-INF)+6=-INF

dp: {8, 11, 7, -INF, -INF}

$3$ 枚目のカードを処理する。
境界通過回数が偶数なら a[2]、奇数なら b[2] を足す。

dp[0]: 8+3=11
dp[1]: max(11,8)+5=16
dp[2]: max(7,11)+3=14
dp[3]: max(-INF,7)+5=12
dp[4]: max(-INF,-INF)+3=-INF

dp: {11, 16, 14, 12, -INF}

$4$ 枚目のカードを処理する。
境界通過回数が偶数なら a[3]、奇数なら b[3] を足す。

dp[0]: 11+9=20
dp[1]: max(16,11)+2=18
dp[2]: max(14,16)+9=25
dp[3]: max(12,14)+2=16
dp[4]: max(-INF,12)+9=21

dp: {20, 18, 25, 16, 21}

$5$ 枚目のカードを処理する。
境界通過回数が偶数なら a[4]、奇数なら b[4] を足す。

dp[0]: 20+4=24
dp[1]: max(18,20)+8=28
dp[2]: max(25,18)+4=29
dp[3]: max(16,25)+8=33
dp[4]: max(21,16)+4=25

dp: {24, 28, 29, 33, 25}

$6$ 枚目のカードを処理する。
境界通過回数が偶数なら a[5]、奇数なら b[5] を足す。

dp[0]: 24+7=31
dp[1]: max(28,24)+3=31
dp[2]: max(29,28)+7=36
dp[3]: max(33,29)+3=36
dp[4]: max(25,33)+7=40

dp: {31, 31, 36, 36, 40}

$7$ 枚目のカードを処理する。
境界通過回数が偶数なら a[6]、奇数なら b[6] を足す。

dp[0]: 31+5=36
dp[1]: max(31,31)+6=37
dp[2]: max(36,31)+5=41
dp[3]: max(36,36)+6=42
dp[4]: max(40,36)+5=45

dp: {36, 37, 41, 42, 45}

境界を通過する回数は $2K$ 回以下なら何回でもよい。
よって、DP テーブル全体の最大値 $45$ が答え。

注意点

答えは、int 型からはみ出る。
DP テーブルを含め、long long 型を用いること。

別解

特になし。