1/*本題為狀態壓縮題
2題目大意 :
3乙個矩陣裡有很多格仔,每個格仔有兩種狀態,可以放牧和不可以放牧,
4可以放牧用1表示,否則用0表示,在這塊牧場放牛,要求兩個相鄰的方
5格不能同時放牛(不包括斜著的),即牛與牛不能相鄰。問有多少種放牛方
6案(一頭牛都不放也是一種方案);
7要列舉每一行中的是否種植(也就是0 1狀態) 最大狀態的12,
8每一行的總共可以有的種植方式就有2^12次方種,
9而二進位制的0 1 特徵剛好可以表示這些種植方式;
10比如0001 表示在第四個位置種植,其他不種;
11比如0101 表示2 4種,依此類推。。。
12所以dp[n][m]的第二維度的大小,就要根據題目中的最大限度,
13本題n,m的大小開到了12;所以我們以13為上限,或者2^12+10都可以;
14dp[n][1<<13];
15*/
16 #include17 #include
18using
namespace
std;
19const
int mod=1e8;
20const
int maxn=1
<<13;21
inta[maxn];
22int dp[13
][maxn];
23int mp[13
];24
int judge1(int x) //
判斷同一行中是否會出現相鄰為1的情況。
2528
int judge2(int i,int x) //
判斷此情況是否是題目中的可列舉情況;
29 32
void init() //
初始化33
38int
main()
3956
int cot=0;57
for(int i=0;i<(1
<)
62for(int i=0;i//
與題目限制的相比較;
63if(!judge2(1,i)) //
如果方案可行,=1;
64 dp[1][i]=1
;
65for(int i=2;i<=n;i++)75}
76}77int ans=0;78
for(int i=0;i)
82 printf("
%d\n
",ans);83}
84return0;
85 }
狀態壓縮DP入門題
在n n n 20 的方格棋盤上放置n 個車 可以攻擊所在行 列 求使它們不 能互相攻擊的方案總數。僅供和我一樣的菜鳥們參考 以n 4為例子解析原始碼 include include using namespace std int64 a 1100000 int main cout 前乙個狀態壓縮的...
狀態壓縮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...