題目大意是有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,然後就列舉最後剩...