差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
programming_algorithm:contest_history:atcoder:2019:0106_educational_dp_4 [2019/02/26] – [解法] ikatakosprogramming_algorithm:contest_history:atcoder:2019:0106_educational_dp_4 [2019/02/26] (現在) – [解法] ikatakos
行 43: 行 43:
   k=6   k=6
               2  3  4  5  6  7  8               2  3  4  5  6  7  8
-  文字列例1  0  0  1  0  0+  文字列例1  0  0  1  0  0           DP[3] に対して……
   条件1                  |--------|    加算される   条件1                  |--------|    加算される
   条件2               |-----|          加算される   条件2               |-----|          加算される
行 50: 行 50:
   条件5                        |--|    範囲外   条件5                        |--|    範囲外
      
-  文字列例2  1  1  1  1  0+  文字列例2  1  1  1  1  0           DP[4] に対して……
   条件1                  |--------|    加算される   条件1                  |--------|    加算される
   条件2               |-----|          既に4文字目で加算済みなので新たには加算されない   条件2               |-----|          既に4文字目で加算済みなので新たには加算されない
-  条件3         |--------------|       既に4文字目(以前)で加算済みなので新たには加算されない+  条件3         |--------------|       既に4文字目で加算済みなので新たには加算されない
   条件4,5 略   条件4,5 略
  
行 82: 行 82:
   DP[6] = MAX( DP[1]+A1+A2+A3, DP[2]+A1+A2, DP[3]+A1+A2, DP[4]+A1, DP[5] )    DP[6] = MAX( DP[1]+A1+A2+A3, DP[2]+A1+A2, DP[3]+A1+A2, DP[4]+A1, DP[5] ) 
  
-あらかじめ、DP配列に、$k$ を含む条件のスコアをそれぞれ $1 ~ L_i$ の範囲に加算しておいてやる。+あらかじめ、DP配列に直接、$k$ を含む条件のスコアをそれぞれ $1 ~ L_i-1$ の範囲に加算しておいてやる。
  
 すると、$DP[k]$ は、ただ1つの区間MAXクエリ $\max(DP[1]~DP[k-1])$ (DPは加算後の値)で求められるようになる。 すると、$DP[k]$ は、ただ1つの区間MAXクエリ $\max(DP[1]~DP[k-1])$ (DPは加算後の値)で求められるようになる。
  
-「DP配列で、決定済みの部分の数値がいじられる」ことにちょっと抵抗感があるが、この方法で効率的に更新を行える。+個人的に「DP配列で、決定済みの部分の数値がいじられる」ことにちょっと抵抗感があるが、この方法で効率的に更新を行えるのだから仕方ない
  
 ここで、現在の $k$ を範囲に含む条件のスコアのみが、過不足無くDPに反映された状態を保たないといけない。 ここで、現在の $k$ を範囲に含む条件のスコアのみが、過不足無くDPに反映された状態を保たないといけない。
行 107: 行 107:
   条件5   ****************  |---|    範囲内となったので、新たに加算   条件5   ****************  |---|    範囲内となったので、新たに加算
  
-それには、以下の処理を行うとよい。 +加算していたのを元に戻すには、同じ範囲に $-A_i$ を加算すればよい。
- +
-  * $k$ から新しく範囲となる($k=L_i$)条件に対して、$DP[1]~DP[L_i-1]$ に $A_i$ を加算する +
-  * $k$ で範囲が終了する($k=R_i$)条件は、加算していたのを元に戻す($DP[1]~DP[L_i-1]$ に $-A_i$ を加算する)+
  
 まとめると、$k$ を1つずつ見て、$DP[k]$ を小さい方から確定させていく過程で、 まとめると、$k$ を1つずつ見て、$DP[k]$ を小さい方から確定させていく過程で、
programming_algorithm/contest_history/atcoder/2019/0106_educational_dp_4.txt · 最終更新: 2019/02/26 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0