poj3254 狀態壓縮dp

2022-03-11 00:15:58 字數 1109 閱讀 3711

題意:給出乙個n行m列的草地,1表示肥沃,0表示貧瘠,現在要把一些牛放在肥沃的草地上,但是要求所有牛不能相鄰,問你有多少種放法。

分析:假如我們知道第 i-1 行的所有的可以放的情況,那麼對於第 i 行的可以放的一種情況,我們只要判斷它和 i - 1 行的所有情況的能不能滿足題目的所有牛不相鄰,如果有種中滿足,那麼對於 i 行的這一中情況有 x 中放法。 但是我們又發現,狀態是一種放法,不是我們平常dp的簡單的狀態,所以要用狀態壓縮!

dp[i][j]表示第i行狀態為j的個數。

dp[i][j] = sum;

第i行可以由上一行的合法的狀態推導來。

#include#include

#include

#include

#include

#include

#include

#include

#define inf 1000000007

#define mod 100000000

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

using

namespace

std;

const

int maxn = 13

;int

n,m;

intmp[maxn];

int dp[maxn][(1

memset(dp,

0,sizeof(dp));//

dp表示第i行狀態為j時合法的個數

for(int i = 0; i < (1

<< m); i++)

}for(int i = 0; i < cnt; i++)

}for(int i = 2; i <= n; i++)

for(int k = 0; k < cnt; k++)}}

}ll ans = 0

;

for(int i = 0; i < cnt; i++)

cout

}return0;

}

POJ 3254 (狀態壓縮DP)

思路 狀態壓縮dp,用二進位制位的1表示放了,0表示沒有放。設dp i j 表示第i行狀態為j時,前i行的方案數,狀態轉移方程就是 dp i j dp i 1 k j與k這兩個狀態不衝突。最後答案就是dp n 1.top 之和。include include include include incl...

poj3254 狀態壓縮DP

全程精講 農夫有一塊地,被劃分為m行n列大小相等的格仔,其中一些格仔是可以放牧的 用1標記 農夫可以在這些格仔裡放牛,其他格仔則不能放牛 用0標記 並且要求不可以使相鄰格仔都有牛。求方案數 include include using namespace std define mod 10000000...

poj3254 狀態壓縮dp

題意 乙個n m的矩陣,每個格仔是0或者1,1表示土壤肥沃可以種植草地,0則不可以。在種草地的格仔可以放牛,但邊相鄰的兩個格仔不允許同時放牛,問總共有多少種放牛的方案 不放牛也算一種情況 思路 狀態壓縮 感覺不大像dp。dp i j 表示第i行狀態為j時符合條件的方案數 我們可以先求出一行的所有可行...