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 取反 一元運算子,...