狀壓DP入門記錄

2021-09-25 12:05:49 字數 1775 閱讀 5586

poj - 3254

農場主john新買了一塊長方形的新牧場,這塊牧場被劃分成m行n列(1 ≤ m ≤ 12; 1 ≤ n ≤ 12),每一格都是一塊正方形的土地。john打算在牧場上的某幾格里種上美味的草,供他的奶牛們享用。

遺憾的是,有些土地相當貧瘠,不能用來種草。並且,奶牛們喜歡獨佔一塊草地的感覺,於是john不會選擇兩塊相鄰的土地,也就是說,沒有哪兩塊草地有公共邊。

john想知道,如果不考慮草地的總塊數,那麼,一共有多少種種植方案可供他選擇?(當然,把新牧場完全荒廢也是一種方案)

輸入輸出格式

輸入格式:

第一行:兩個整數m和n,用空格隔開。

第2到第m+1行:每行包含n個用空格隔開的整數,描述了每塊土地的狀態。第i+1行描述了第i行的土地,所有整數均為0或1,是1的話,表示這塊土地足夠肥沃,0則表示這塊土地不適合種草。

輸出格式:

乙個整數,即牧場分配總方案數除以100,000,000的餘數。

銘記:用位運算子一定要加(),其優先順序較低。

#include

using namespace std;

const

int maxn=

13,mod=

1e8;

int mp[maxn]

;//每行用二進位制數字記錄方格資訊

int dp[maxn][1

<;//記錄 到某一行的時候 對應選取的方法數

bool judge[

1<;//記錄1的相鄰位沒有1的二進位制數。

intmain()

}int end=

1

int j=

0;j)for

(int j=

0;j)for

(int i=

2;i<=m;i++)}

}}}long

long ans=0;

for(

int j=

0;j) cout<}

參考blog:

hdu-1074 dp+記錄路徑

是快要交作業了,有n門課,課還有d天就要交,他需要寫c天,超過期限還沒寫完就每多一天扣一分,問你怎麼寫才能讓扣掉的總分少

本質上這道題的轉移方程的意思個人理解如此:

狀壓過程中每個j(假如j這個二進位制數中有m個1)的意義是選其中對應的這些m門課的最優決策,而這個最優決策的選取,是在把其中的某一門課當作最後完成的m種情況中選擇最有解。而通過狀壓二進位制數遞增的性質,這些m種情況最優解的選取,在之前總是記錄完成的,因此可以實現狀態轉移。

#include

using namespace std;

#define inf 0x7ffffff

struct node

;node dp[

1<<15]

;struct snodesubject[20]

;int

main()

for(

int i=

1;i<

1<}}

stack<

int> st;

cout<<].score

<;while

(tmp)

while

(!st.

empty()

)}return0;

}

參考blog:

狀壓DP入門

洛谷題號p1896 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。題解 首先暴搜可肯定是超時的所以我門考慮狀壓 因為每個數都可以用二進位制表示出來 二進位制中01可以表示當前行放的棋子的位置 以及...

狀壓DP入門

首發於摸魚世界 狀壓dp,即狀態壓縮dp,它的精髓在於把dp過程中的乙個 狀態 用乙個二進位制數巧妙的表示出來。接下來就從一些入門的狀壓題目來感受一下狀壓的魅力吧 洛谷p5911 poi2004 prz 大致題意 n 個人過最大承載 w 重量的橋,每個人有重量 w i 與過橋時間 t i 多人一組時...

狀壓DP入門題

學習狀壓之前必須要熟練掌握位運算 位運算名 符號效果 and 按位與如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 l or 按位或兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 xor 按位異或 單身狗操作 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 一元運算子,...