P1879 [USACO06NOV]問題のトウモロコシ畑トウモロコシのフィールドソリューション(注版)

タイトル説明

ファーマージョン(12≤1≤Mを1≤N 12以下)NによりMからなる豊かな新しい長方形の牧草地を購入した正方形区画を。彼は正方形の数の牛のためのいくつかのおいしいトウモロコシを栽培したいと考えています。残念ながら、正方形のいくつかは不妊であり、植えすることができません。キャニーFJは牛が互いに近接して食べること嫌い植物にどの正方形を選ぶとき、そう、彼は隣接している四角形を選択避けることを知っています。どの2つの選択された四角は、エッジを共有しません。彼はまだ工場にするためにどの正方形として最終的な選択を行っていません。

非常に開放的な男であること、ファーマージョンは植栽のための正方形を選択する方法のためのすべての可能なオプションを検討したいと考えています。彼はとてもオープンマインド彼は有効なオプションとして何の四角を選択しないと考えるということです!ファーマージョンは彼が植物に正方形を選択することができますいくつかの方法を決定するのに役立ちます。

(12≤1≤M、12≤1≤N)農夫ジョンは牧草地の新たな矩形片がM行N列に分割されている新たな牧草地を購入し、各セルは、土地の正方形です。ジョンは彼の牛が楽しむためのいくつかのおいしい牧草地の草の上に植えられたジェリーする予定。

残念ながら、いくつかの非常に不毛の土地は草を使用することはできません。感情のような草の牛のと、排他的な作品、ジョンは二つの隣接地を選択しないように、すなわち、どの2つは共通のエッジの草を持っていません。

あなたは、彼が選択したプログラムを植えるために、そして、草の中に種の総数を総ブロック数を考慮していない場合にはジョンは、知りたいですか?(もちろん、新しい完全に放棄した牧場は、プログラムもあります)

入出力フォーマット

入力フォーマット:

 

最初の行の2つの整数MとNは、スペースで区切られました。

各プロットの状態で説明スペースで区切られたN個の整数を含む各行:M + 1行を介して2。I + 1記載の陸線、i行目、0または1のすべての整数であり、次いで、1 0は、適切な草地をしない示し、十分な肥沃な土地を示しています。

 

出力フォーマット:

 

牧場割り当て方式が100,000,000の総数で割った整数。

 

サンプル入力と出力

入力サンプル#1:  コピー
2 3 
1 1 1 
0 1 0
出力サンプル#1:  コピー
9 

ソリューション:
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 M = 1E9;
int型 M、N、F [ 13 ]、[ 4096 ]、F [ 13 ]、フィールド[ 13 ] [ 13 ]。
// 最大の状態:(11111111111)2 =(4095)10 
BOOLの状態[ 4096 ]。
INT メイン()
{ 
    CIN >> M >> N。
    以下のためにint型 iは= 1 ; I <= M iは++ のためにINT J = 1 ; J <= N; J ++
            CIN >> 分野[I]、[J];
     のためのINT I = 1 ; I <= M; I ++ のためのINT J = 1。 ; J <= N; J ++ 
            F. [I] =(F. [I] << 1)+分野[I]、[J]; // 各列Fと状態配列を保存、例えば、フィールド[1] [1] = 1、 Fので、[i]は= 0 << 1 + 1、 すなわち、01そう...... 
     // F. [I]:ライン状態に私は
    int型 MAXSTATE = 1。 << n-は、
     のためにint型 I = 0 ; I <MAXSTATE; I ++の
        状態[I]は =((I&( << I 。1))== 0)&&((I&(I >> 1))== 0); // 別の前処理各行(すなわち、アップリンクとダウンリンク・バンクへの影響を考慮せずに)、上下かどうかを検討する必要がないため満たすために隣接していない。これは線が隣接していない左右の特定の配置満たす決定することを意味する
        / * 
            サンプル:. 3 2 
                      1 1 1 
                    0 0 1 
            ここで、最初の行満たす:0 0 0,0 0 1,0 1 0,1 0 0,1 0 1(N 番目のケース2の合計が、満足のみ5種類
        * /  
    F [ 0 ] [ 0 ] = 1 ; //は、ゼロ番目の行を初期化
    するためのINT I = 1 ; I <= M; I ++ のためのINT J = 0 ; J <MAXSTATE; J ++)//各状態の列挙i行目
            IF(状態[J] &&((J&F. [I])== J))// 状態[J] == 1であれば(即ち、この条件を満たすように隣接していない)と本実施形態では、(草を培養することができる状態jに銀行不可)銀行で実施することができる
            / * 
                この時点でそのような状態jは1001であるが、銀行F [i]が(草など)であります0011は、満たされていない
            * /  
                INT K = 0 ; K <MAXSTATE; K ++)// 行の状態を列挙
                    IF((J&K)== 0// もし銀行の状態線が衝突し、ダウンDPない
                    / * 
                        例:
                            K:0010 
                            J:1001 
                            K&J = 0、すなわちk個の状態jの状態しない衝突
                    * /  
                        F [I] [J] =(F [I] [J] + F [I - 1] [K])%M; // 行i番目の前の状態は、Jの正規数方式で、もしJ&K == 0、次いで溶液の累積数満たす
    整数 ANS = 0 ;
     のためのint型私は= 0 ; iがMAXSTATEを<; I ++ )// プログラムiは、蓄積された正当なものである最後の行の状態、すなわち、最終的な回答 
        ANS + = F [M] [i]は、ANS%= M; 
    COUT << ANS << ENDL; 
    GETCHAR(); // 起こることはできません 
    getchar関数を(); //はに起こることができない
    の戻り 0 ; 
}

羅区ありがとうhttps://www.luogu.org/space/show?uid=9671コードを提供!

私は、コメントがリストに追加されて理解し、私はあなたが理解していない問題の解決に役立つことを願っています!

おすすめ

転載: www.cnblogs.com/tfyzs/p/11200174.html