小型リニアDP。多くの方法は、八仙は再集計します。
私は私についてお話したいと思います:
1つの#include <cstdioを> 2 の#define MOD十億七 3。 チャー S [ 1000005 ]; int型 DP [ 1000005 ] [ 2 ] [ 2 ]、N-し; //は鉱山ではない、私の権利がありません 4。 INT メイン(){ 5。 scanfの(" %S "、S + 1 ); 6。 ため(N = 1は、S [N-]; N - ++); N--は、 7 DP [ 0 ] [ 0 ] [ 0 ] DPを= [ 0 ] [ 0 ] [ 1。 ] =1 ; 8 用(int型 i = 1 ; iが<= N; ++ i)が 9 であれば(S [I] == ' 0 ')DP [I] [ 0 ] [ 0 ] = DP [I- 1 ] [ 0 ] [ 0 ]。 10 他の 場合(S [I] == ' 1 ')DP [I] [ 0 ] [ 0 ] = DP [I- 1 ] [ 1 ] [ 0 ]、DP [I] [ 0 ] [ 1 ] = DP [I- 1 ] [ 0 ] [ 0 ]。 11 他の 場合(S [I] == ' 2 ')DP [I] [ 0 ] [ 1 ] = DP [I- 1 ] [ 1 ] [ 0 ]。 12 他の 場合(S [I] == ' * ')DPは、[I]は、[ 1 ] [ 1 ] DP [I] [= 1 ] [ 0 ] =(DPを[I- 1 ] [ 0 ] [ 1 ] + DP [I- 1 ] [ 1 ] [ 1 ])%MOD。 13 他{ 14 DP [I] [ 0 ] [0 ] = DP [I- 1 ] [ 0 ] [ 0 ]。// 0 15 (DP [I] [ 0 ] [ 0 ] + = DP [I- 1 ] [ 1 ] [ 0 ])%= MOD; DP [i]が[ 0 ] [ 1 ] DPを= [I- 1 ] [ 0 ] [ 0 ]。// 1 16 (DP [I] [ 0 ] [ 1 ] + = DP [I- 1 ] [ 1 ] [ 0 ])%= MOD。// 2 17 DP [I] [ 1 ] [1 ] DP [I] [= 1 ] [ 0 ] =(DPを[I- 1 ] [ 0 ] [ 1 ] + DP [I- 1 ] [ 1 ] [ 1 ])%MOD。// * 18 } 19 のprintf(" %d個の\ n "、(DP [n]が[ 0 ] [ 0 ] + DP [n]を[ 1 ] [ 0 ])%のMOD)。 20 }
私の意味はDPです:DP [i]の[この] [次へ]考慮後のi番目の位置を表し、何のプログラム番号と鉱山は、この次の位置はありません。
考えてみましょう:あなたは以前の1が、この1つはあるものが何であるかを知っていれば、あなたは何を次のイエスを推測することができます。
地雷除去の間に一次元的な役割、唯一の3つの隣接するグリッドの制約がありますので。
したがって、私たちは何から転送されたことにより、DP [i]を[T] [n]を考慮してください。
ビットiが'0'である場合、それは私されていない、そうでない光線の前にあり、以下にもならない、DP [I]は[ 0 ] [ 0 ] DPを= [I-1] [ 0 ] [ 0 ](文字コードは色に対応することに留意されたいです)
それが「1」であれば、それは私のものではありません 2種類に分け、:
それ前部及び無リア:DP [I] [ 0 ] [ 0 [1-I] DP = [ 1 ] [ 0 ]。
それは先行しないと続く:DP [I] [ 0 ] [ 1。 DP = [-I 1] [] 0 ] [ 0 ]。
それは'2'であれば、それは私のものではありませんが、前のポストは、レイがあります:DP [I] [ 0 ] [ 1。 ] DP = [1-I。] [ 1。 ] [ 0 ];
場合、それは私のものです、そして自由にフロントインチ 。バックもランダムです。。:[DP [I] 1 ] [1] [DP = [I] 。1 ] [0] DP = [-I 1] [0] 。1 ] [1] [+ DP [-I 1] 。1 ];
あなたはDunongが好きなこれらの状態の上に疑問符をつけた場合。
第1の状態DP [0] [0] [0] DP [0] [0] [1] = 1そこには私のものではありませんし、最初の格子0で、それが0格子を制限されることはありません言っても権利を持っていないので、=。
端状態DP [n]が[1] [0] + DP [n]が[0] [0] n番目の格子(それは合法的でないならば、0をDP)、及びNにそこには鉱山はないと気ためグリッド上の1は私ではありません。
完成しました!