[説明] BZOJ P1801 DP

より多くの状態DPを考慮する必要があります


 

チェスのルールによって示し、二つの銃の最大

3丁の銃がある場合、彼らはお互いを傷つけることができるので、

 

Fを設定する[I] [J] [k]が最前列であるiおよび列jは、ピースを有し、k列の二枚

包含と除外は、作品への列の数MJKについては利用できません

私たちは、国家の正方形の部分を列挙します

<1>のみの作品を置きます

(1)石なしに行のピースを置きます

 ピース離れては、石なしカラム+1、行の一部が存在することになる場合に-1

  F [I] [J] [k]は、fは= [I] [J] [K] + F [I-1] [J-1] [K] *(MJ-K + 1)

(2)部分のこの部分のカラムを有しています

 ピース離し、カラム-1の部分は、カラム+ 1の2つの片が存在する場合

  F [i] [j]は[K]をf [i]は[J] [K] + F [I-1] [J + 1] [K-1] *(J + 1)=

<2> 2枚を入れて

(1)カラムの上に置い、カラム上のピースをしました

 2枚が離れて、​​柱1の部分があるでしょうすると、1列の2枚、列の無い部分を持つことになります-1

   F [I] [J] [k]は、F [i]は[J] [K] + F [I-1]〜[J] [K-1] * J×(MJ-K + 1)=

(2)は、2つの片を列に配置されています

 場合ピース離れ、行の断片-2 +2の、カラム二枚

  F [i] [j]は[K]をf [i]は[J] [K] + F [I-1] [J + 2] [K-2] *(J + 2)*(J + 1)= / 2

(3)は、二枚の列に配置されていません

 場合離れ片、行+2の断片、カラムはない石-2

  F [I] [J] [k]はF [I] [j]を= [K] + F [I-1] [J-2] [K] *(MJ-K + 2)*(MJ-K + 1)/ 2


コード

// 
//   main.cppに
 //   bzoj
 // 
//   2019年7月18日にgengyfによって作成されます。
//   著作権©2019 Yifanの庚。全著作権所有。
//
 
の#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
名前空間gengyf { 
    インラインINT 読み出す(){
         int型、F = 1、X = 0チャー C = GETCHAR()。
        一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' -')、F = - 1 ; C = GETCHAR();}
         一方(> = C ' 0 ' && C <= ' 9 '){X = X * 10 + C- ' 0 ' ; C = GETCHAR();}
         戻り F * X; 
    } 
の#define MOD 9999973
     int型N、M、ANS。
    INT [F 105 ] [ 105 ] [ 105 ]。
    インラインINT C(INT X){
         リターン X *(X- 1)/ 2モッズ; 
    } 
    int型のmain(){ 
        N)=(読み取り; M = 読み取ります()。
        F [ 0 ] [ 0 ] [ 0 ] = 1 以下のためにint型 i = 1 ; iは= <N; I ++ のためのINT J = 0 ; J <= Mであり、j ++ のためのINT K = 0 ; K <= MJあり、k ++ ){ 
                    F [I] [J] [K] = F [I- 1 ] [j] [k]は、
                    もし(K> = 1 F)[I] [J] [K] + = [F I-1 ] [+ J 1 ] - [K- 1 ] *(J + 1); // 置く
                    IF(J> = 1)F [I] [J] [K] + = F [I- 1 ] [J- 1 ] [K] *(MJ-K + 1); // ないピースを置く
                    IF(K> = 1)F [I] [J] [K] + = F [I- 1 ] [J] [ - K- 1。 ] * J *(MJ-K + 1 );
                     // 2を入れ、しない一体のピースで
                    IF(K> = 2)F [I] [J] [K] + = F [ I- 1 ] [J + 2 ] [ - K- 2 ] * C(J + 2 );
                     //2入れ、片が配置されている
                    IF(J> = 2)(F [I] [J] [K] + = F [I- 1 ] [J- 2 ] [K] * C(MJを+ K 2 ));
                     // 片が配置されている、いない二つ置く 
                    F [I] [J] [K]%= MODを; 
                } 
        ためint型 I = 0を I <= M; I ++のためINT J = 0 ; J <= M; J ++ ){ 
                ANS + = F [N-] [I]、[J]; 
                ANS%= MOD; 
            } 
        のprintf(" %のD "、(ANS + MOD)%MOD);
        リターン 0 ; 
    } 
} 
int型のmain(){ 
    gengyf ::メイン()。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/gengyf/p/11210762.html