概要
動的計画法を用いて解くことのできる典型的な問題の例です.
少し複雑ですが,状態を丁寧に整理して漸化式を導いてください.
問題原案:uni_kakurenbo
解説
動的計画法を用いて解くことができます.
その一例を紹介します.
2 数列 A,B はいずれも 0-based indexing とします.
-
定義
- DP0(i,j):=(先頭 i+1 枚目までの裏返し方で,末尾に裏を向いたカードが j 個連続するようなものの総数)
- DP1(i,j):=(先頭 i 枚目までの裏返し方で,末尾に裏を向いたカードが j 個連続するようなものスコアの総和)
-
初期状態:
- DP0(0,0)=DP0(0,1)=1
- それ以外はすべて 0.
-
遷移:
- Fori←[0,1,…,N):
- DP0(i+1,0)←∑{DP0(i,j)∣1≤j<k} #任意の枚数裏が連続 → 表
- DP1(i+1,0)←∑{DP1(i,j)∣1≤j<k}+DP0(i,0)⋅Ai
- Forj←[1,2,…,K]:
- DP0(i+1,j)←DP0(i,j−1) # j−1 枚裏が連続 → j 枚裏が連続
- DP1(i+1,j)←DP1(i,j−1)+DP0(i,j)⋅Bi
-
結果:
- ∑kDP1(N,k)
解説:uni_kakurenbo
実装例