狀態壓縮dp入門題目

2021-07-31 22:07:08 字數 1167 閱讀 4271

題目大意是有m×n的玉公尺地,但其中有些是不肥沃的,不能種植。用1來代表肥沃,0代表不肥沃。另外奶牛不喜歡挨著吃,也就是說要間隔著種植,求有幾種種植方式,並將計算結果對1e8取模。

#include #include using namespace std;

int dp[12][1 << 12]; // dp[i][s] := 第i行的狀態為s時的方法總數

int bad[12]; // 荒地的mask

int mod = 100000000;

int m, n;

//************************************

// method: dfs

// fullname: dfs

// access: public

// returns: void

// qualifier: 遍歷一行

// parameter: int row y座標

// parameter: int line x座標

// parameter: int s 當前集合

// parameter: int except_s 排除集合(也就是上一行地的狀態加上這一行荒地的狀態)

// parameter: int pre_dp 上一行對應的個數

//************************************

void dfs(int row, int line, int s, int except_s, int pre_dp)

dfs(row, line + 1, s, except_s, pre_dp); // 這一行還沒有種完,繼續嘗試往下種

if (!(except_s & (1 << line))) // 無重疊

}///submain//

int main(int argc, char *argv)

}dfs(0, 0, 0, bad[0], 1);

for (int i = 1; i < m; ++i)

}int ans = 0;

for (int i = 0; i < (1 << n); ++i)

cout << ans << endl;

return 0;

}

狀態壓縮DP入門

中考前乙個學期都沒怎麼碰資訊,終於中考完了,第乙個來學習一下幾個dp。狀壓dp在提高組好像挺常考,而且我也一直不太會,便來學習一下。狀壓dp的基礎便是位運算。先來列幾個 與運算,二進位制下每一位進行如下運算 1 1 1 1 0 0 0 1 0 0 0 0,如 110 100 100,十進位制下即表示...

狀態壓縮dp入門

poj1321 我們可以把棋盤的每一行看做是乙個狀態,如果某一列放置了棋子,那麼就標記為1,否則就標記為0.然後把它看成是乙個二進位制數,然後轉為10進製數,就可以當做陣列下標然後進行狀態轉移了 設dp i s 為處理到第i行時,狀態為s的方法數 那麼我們列舉第i 1行的所有狀態s dp i s d...

狀態壓縮DP題目小節(二)

最近做的狀態壓縮dp小節 zoj 4257 一堆氣體相互碰撞產生能量,求最後能產生的最大能量,應該是很基礎的狀態壓縮dp吧,設dp flag 表示狀態flag時能產生的最大能量,flag中1表示該氣體還存在,0表示該氣體已經消失 邊界條件是flag所有位都為一時,這時產生的能量為0,然後就列舉最後剩...