題意:給出乙個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時符合條件的方案數 我們可以先求出一行的所有可行...