1. 程式人生 > >POJ 3254 (基礎 狀態壓縮 DP )

POJ 3254 (基礎 狀態壓縮 DP )

Corn Fields
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 14837 Accepted: 7768

Description

Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and can't be planted. Canny FJ knows that the cows dislike eating close to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.

Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways he can choose the squares to plant.

Input

Line 1: Two space-separated integers: M and N 
Lines 2..M+1: Line i+1 describes row i of the pasture with N space-separated integers indicating whether a square is fertile (1 for fertile, 0 for infertile)

Output

Line 1: One integer: the number of ways that FJ can choose the squares modulo 100,000,000.

Sample Input

2 3
1 1 1
0 1 0

Sample Output

9

【題目大意】一個矩陣裡有很多格子,每個格子有兩種狀態,可以放牧和不可以放牧,可以放牧用1表示,否則用0表示,在這塊牧場放牛,要求兩個相鄰的方格不能同時放牛,即牛與牛不能相鄰。問有多少种放牛方案(一頭牛都不放也是一種方案)

分析:狀態壓縮DP,時間複雜度O(n* 2^m *2^m) , 用 x & (x<<1)來判斷相鄰位置是否有都為1的情況,

【狀態表示】dp[state][i]:在狀態為state時,到第i行符合條件的可以放牛的方案數

【狀態轉移方程】dp[state][i] =Sigma dp[state'][i-1] (state'為符合條件的所有狀態)

【DP邊界條件】首行放牛的方案數dp[state][1] =1(state符合條件) OR 0 (state不符合條件)

程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <queue>
#define mem(p,k) memset(p,k,sizeof(p));
#define rep(a,b,c) for(int a=b;a<c;a++)
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x6fffffff
#define ll long long
using namespace std;
const int N=30010;
const int mod=100000000;
int n,m,num,tol;
int mapp[15],plan[10000];
int dp[15][10000];
int main(){

    while(~scanf("%d%d",&n,&m)){
        tol=0;
        for(int i=0;i<(1<<m);i++){
            if(i&(i<<1))continue;
            plan[tol++]=i;
        }
        for(int i=1;i<=n;i++){
            mapp[i]=0;
            for(int j=0;j<m;j++){
                scanf("%d",&num);
                if(!num)mapp[i]+=(1<<j);
            }
        }
        for(int i=0;i<tol;i++){
            if(plan[i] & mapp[1])dp[1][i]=0;
            else dp[1][i]=1;
        }
        for(int i=2;i<=n;i++){
            for(int j=0;j<tol;j++){
                if(plan[j] & mapp[i])continue;
                for(int k=0;k<tol;k++){
                    if(plan[j] & plan[k] || plan[k] & mapp[i-1])continue;
                    dp[i][j]+=dp[i-1][k];
                    dp[i][j]%=mod;
                }
            }
        }
        int ans=0;
        for(int i=0;i<tol;i++)ans=(ans+dp[n][i])%mod;
        printf("%d\n",ans);
    }

    return 0;
}

/*




*/


相關推薦

POJ 3254 基礎 狀態壓縮 DP

Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14837 Accepted: 7768 Description Farmer John has purchased

POJ 3254 Corn Fields(狀態壓縮DP入門)

lang gre eas lse tile not using which 有一個 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (

POJ 3254狀態壓縮DP

【題目大意】一個矩陣裡有很多格子,每個格子有兩種狀態,可以放牧和不可以放牧,可以放牧用1表示,否則用0表示,在這塊牧場放牛,要求兩個相鄰的方格不能同時放牛,即牛與牛不能相鄰。問有多少种放牛方案(一頭牛都不放也是一種方案) 【解析】根據題意,把每一行的狀態用二進位制的數表示,

POJ 2411狀態壓縮DP

open long true poj 如果 [0 pri 檢查 out 題意:一個矩陣,只能放1*2的木塊,問將這個矩陣完全覆蓋的不同放法有多少種。 如果是橫著的就定義11,如果豎著的定義為豎著的01,這樣按行dp只需要考慮兩件事兒,當前行&上一行,是不是全為1,不

poj 2411 Mondriaan's Dream 狀態壓縮dp

題目連結:哆啦A夢傳送門 題意:給出n*m的方塊,讓你用1*2的方塊去填滿它,問:有多少種不同的方案? 題解: 參考連結:https://blog.csdn.net/u014634338/article/details/50015825 看完題解,大概就這幾個核心點。 1,我

UVa 11825 黑客的攻擊狀態壓縮dp

狀態壓縮dp 題意 規劃 ace 部分 ons freopen ... 接下來 https://vjudge.net/problem/UVA-11825 題意: 假設你是一個黑客,侵入了一個有著n臺計算機(編號為0,1,...,n-1)的網絡。一共有n種服務,每臺計算機

HDU 3001狀態壓縮DP

狀態壓縮 printf pri names urn 壓縮 puts -1 路徑 題意:遍歷所有的城市的最短路徑,每個城市最多去兩遍。將城市的狀態用3進制表示。 狀態轉移方程為 dp[NewS][i]=min( dp[NewS][i],dp[S][j]+dis[i][j])

狀態壓縮·一狀態壓縮DP

pos weight i+1 else urn footer 分享 pre 同時 描述 小Hi和小Ho在兌換到了喜歡的獎品之後,便繼續起了他們的美國之行,思來想去,他們決定乘坐火車前往下一座城市——那座城市即將舉行美食節! 但是不幸的是,小Hi和小Ho並沒有能夠買到很好的火

HDOJ--3681--Prison BreakBFS預處理+狀態壓縮DP

-s cin pos hdoj con 多少 電源 too 最大的 題意 F--起點 S--空格 G--能量池,只能充一次電,充完之後G變為S,也可已選擇不充而當成普通的S D--激光區,不能走 Y--電源開關 M被關在一所監獄之中,F為起點,每走一步(上下左右)消耗1節能

HDU 4539 鄭廠長系列故事——排兵佈陣狀態壓縮DP

鄭廠長系列故事——排兵佈陣 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define N

HDU 4049 Tourism Planning狀態壓縮DP

http://acm.hdu.edu.cn/showproblem.php?pid=4049 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int

牛客國慶集訓派對Day2 E 資料排序狀態壓縮dp

雖然說得分可以一樣,但是我們還是可以僅僅只用兩個狀態0和1來表示這一題。 某一個位置為0表示當前這個數字還沒有被標號,也即當前數字比所有的已經標號的數字都要小。如果為1,那麼說明這個已經標號,並且這個數字與比它先標號的數字和與其相等的數字的衝突值已經計算過了

HDU3001——Travelling狀態壓縮DP

Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2393    Accepted Subm

hdu 1565 方格取數(1)狀態壓縮DP

終於可以寫題解了。因為一個細節上的失誤,讓我重新修改的程式碼一直通不過測試,鬱悶。 程式碼毫無參考價值,剛學的狀態壓縮DP,程式碼寫得很難看。 #include<stdio.h> #inc

狀態壓縮dp學習 + poj3254最簡單的狀態壓縮dp

初學狀壓就找個比較簡單的dp,應該是最好想的狀態壓縮了。 狀態壓縮dp也就是如果正常開陣列,必然會導致記憶體過大,所有需要另外找一種辦法來代替這個問題,那麼就用二進位制來替代,這應該就是對於狀態壓縮最通俗的解釋了。關於一些二進位制的操作比如 1 如何判斷數字x第i位是否為1

鋪磚問題狀態壓縮DP

給定n*m的格子,每個格子被染成了黑色或者白色。現在要用1*2的磚塊覆蓋這些格子,要求塊與塊之間互相不重疊,且覆蓋了所有白色的格子,但不覆蓋任意一個黑色格子。求一共有多少種覆蓋方法,輸出方案數對M取餘後的結果。 限制條件: 1<=n<=15 1<=m<

wustoj2230 Cheap deliveriesdijkstraheap優化 + 狀態壓縮 + dp

題目: 2230: Cheap deliveries Time Limit: 2 Sec  Memory Limit: 64 MB   64bit IO Format: %lld Submitted: 40  Accepted: 16 [Submit][Status]

hdu4057ac自動機,狀態壓縮dp

Dr. X is a biologist, who likes rabbits very much and can do everything for them. 2012 is coming, and Dr. X wants to take some rabbits to Noah's Ark, or t

Twenty Questions記憶化搜尋,狀態壓縮dp

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #inclu

POJ 2411 鋪地磚 狀態壓縮dp入門

Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10402 Accepted: 6035 Description Squares and rectangles