https://www.luogu.com.cn/problem/P1879
タイトル説明
ファーマージョン(1≤M≤12; 1≤N≤12)NによりMからなる豊かな新しい長方形の牧草地を購入した正方形区画を。彼は正方形の数の牛のためのいくつかのおいしいトウモロコシを栽培したいと考えています。残念ながら、正方形のいくつかは不妊であり、植えすることができません。キャニーFJは、植物にどの正方形を選択するときに、彼が隣接している四角形を選択避け、牛が互いに近接して食べて嫌いということを知っています。どの2つの選択された四角は、エッジを共有します。彼はまだ工場にいる四角のように最終的な選択を行っていません。
非常に開放的な男であること、ファーマージョンは植栽のための正方形を選択する方法のためのすべての可能なオプションを検討したいと考えています。彼はとてもオープンマインド彼は有効なオプションとして何の四角を選択しないと考えるということです!ファーマージョンは彼が植物に正方形を選択することができますいくつかの方法を決定するのに役立ちます。
各セルは、土地の正方形であり、農夫ジョンは牧草地の新たな矩形片がM行N列(1≤N≤12 1≤M≤12)に分割されている新たな牧草を買いました。ジェリーは彼の牛が楽しむためにいくつかのおいしい牧草地の草の上に植えられたとジョンは予定です。
残念ながら、いくつかの非常に不毛の土地は草を使用することはできません。そして、ジョンそうな感じのような草の牛の排他的な部分が、言うことである二つの隣接する土地を、選択しないと、どの2つは共通のエッジの草を持っていません。
あなたは、その後、草の中に彼が選んだの植樹プログラムのための種の総数を総ブロック数を考慮していない場合にはジョンは、知りたいですか?(もちろん、新しい完全に放棄した牧場は、プログラムもあります)
入力形式
最初の行の2つの整数MとNは、スペースで区切られました。
図2は、M + 1行を:Nの整数を含む各行は、各プロットの状態で説明空間によって分離しました。I + 1記載の陸線、i行目、0または1のすべての整数であり、次いで、1 0は、適切な草地をしない示し、十分な肥沃な土地を示しています。
出力フォーマット
牧場割り当て方式が100,000,000の総数で割った整数。
サンプル入力と出力
入力#1
2 3 1 1 1 0 1 0
出力#1
9
明らかに、これは圧力のようなものですDP
図1に示すように、第1のプリ草状態i番目の行は、整数圧縮状態[I]です。
図2に示すように、すべての非隣接の前処理状態の裁判官のステータス[i]は、各行(1 << M)の合計-1状態が、多くは、隣接する場合に存在する、事前の状態処理が法的できません多くの時間短縮の複雑さの状態遷移。
それでは、どのように決定することに隣接した状態かどうか?のみ(I&は、(i << 1)== 0)&&(I&I >> 1)== 0()を決定することができ、隣接する意志の裁判官の存在は[I]が偽に設定されている場合、隣接不在それは本当でした。
3、どのように唯一の肥沃な草原にそれに対処するには?i行目の地形状態[i]と、状態jに対して、状態に列挙[I]が&J == jの二つの状態を示す場合に不毛に草せず、すなわち同一です。
図4は、i番目の行及びI-1のためのラインは、プログラム線k、条件を満足する行j&K == 0プログラムを列挙し、草を通信していません。
1の#include <ビット/ STDC ++ H> 2 の#define PB一back 3 の#define Fiの第 4 の#define SE第 5のtypedef 長い 長LL。 6 CONST INT INF = 0x3f3f3f3f 。 7つの CONST ダブル EPS = 1E- 8 。 8 CONST INT MOD = 1E8。 9 CONST INT MAXN = 1E5 + 10 。 10 使って 名前空間はstdを、 11 12 INT G [15 ] [ 15 ]; 13は、 INT状態[ 15 ]; // ランド状態i番目とi行目の0,1スプライシング[I] [J]と等価であり、行、 14 INT DP [ 15 ] [ 1 << 12 + 5 ]; // i番目の行に、jはプログラムナンバーの状態で 15 INT裁判官[ 1 << 12 + 5 ]; // 裁判官[i]はiがこの状態レコードに有効で 16 INT N-、M; 17 18であり、 INT ()主 19。 { 20である DEBUG #ifdefの 21である (freopenは"SAMPLE.TXT " " R "STDIN); 22 #endifの23 24 のscanf(" %D%D "、&N、&M); 25 用(INT iは= 1 ; iが<= N; I ++ ) 26 { 27 用(INT J = 1 ; J <= Mであり、j ++ ) 28 { 29 のscanf(" %dの"、&G [I] [J]); 30 状態[I] =(状態[I] << 1)+ G [i]は[J]; // 各ラインの状態を取得する 31ことである } 32 } 33である ため(INT I = 0 ;私は<(1 << M); I ++)//の各状態の要件を満たすように決定された 34である 判事[I] =(I&(I <! < 1))&&(I&(I >>!1。 )); 35 DP [ 0 ] [ 0 ] = 1 ; 36 用(INT I = 1 ; I <= N; I ++)// 列挙各列 37 { 38である ため(INT J = 0 ; J <(1 << M); J ++)// 列挙線の各可能な状態 39 { 40 IF(判事[J] &&((J&状態[I])== J))// 状態修飾ライン、状態jと状態[I]と同じです肥沃な土地に草確保 41は 、{ 42である ため(int型 K = 0、K <(1 << M); K ++ ) 43は 、{ 44は IF((J&K)== 0)// 行にこの回線状態1つの二つの状態の同じ列に表示されていない 45 DP [I] [J] =(DP [I] [J] + DP [I- 1 ] [K])%MOD; 46である } 47 } 48 } 49 } 50 INT ANS = 0 。 51 のために(INT iは= 0 ; I <(1 ; << M)は、i ++ ) 52 ANS =(ANS + DP [n]は[I])%のMOD。 53 のprintf(" %dの\ n " 、ANS)。 54 55 戻り 0 ; 56 }
-