程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【poj3254】Corn Fields題意&題解&代碼(C++)

【poj3254】Corn Fields題意&題解&代碼(C++)

編輯:C++入門知識

【poj3254】Corn Fields題意&題解&代碼(C++)


題目鏈接:
http://poj.org/problem?id=3254
題意:
給出一個n行m列的草地,1表示肥沃,0表示貧瘠,現在要把任意數量牛放在肥沃的草地上,但是要求所有牛不能相鄰,問有多少種放法。
題解:
狀態壓縮型dp,一般可以通過數據范圍來判斷,我們可以將每一行的肥沃草地狀態與牛的分布狀態用二進制數來表示出來,dp[i][j]表示在第i行牛的狀態為j的方法數,轉移方法見代碼,而且我們發現題上要求兩個牛不能相鄰,那麼在二進制狀態種有很多的狀態都不滿足這一性質,原本2^m種狀態經過預處理後發現實際上滿足的限制的狀態數很少,可以自己寫個小程序算一下最多有多少種。
代碼:
#include
#include
#include
using namespace std;
int ans,n,m,dp[13][1<<13],map[13],st[1<<13];
int M=1e8;
int judge1(int x)//判斷此狀態是否有相鄰的牛
{
    return x&(x<<1);
}
int judge2(int i,int x)//判斷此狀態與地圖是否沖突
{
    return map[i]&x;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    {
        int x;
        scanf("%d",&x);
        if (x==0) map[i]+=(1<<(j-1));
    }
    int tot=0;
    for (int i=0;i<=(1<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved