狀態壓縮DP入門題

2022-06-02 08:00:09 字數 1318 閱讀 4037

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...