狀壓DP入門

2021-10-14 01:29:19 字數 1307 閱讀 8823

洛谷題號p1896

在n×n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。

題解:首先暴搜可肯定是超時的所以我門考慮狀壓 因為每個數都可以用二進位制表示出來 二進位制中01可以表示當前行放的棋子的位置 ,以及個數 首先我們定義乙個dp陣列dp[i][j][x]表示第i行放的是j的二進位制位數的形式前i一共放了x個。

首先我們定義乙個陣列判斷當前行是否合法 首先我們引入&操作 這個操作表示兩個數二進位制相互&操作 要是都為1的話則為1有乙個為0的話則為0.可以使用者判斷當前行是否合法主要**如下

bool  check1

(int x)

其次 我們在定義乙個函式用來判斷當前行和上一行的棋子放置位置的狀態是否合法 主要是判斷要是當前位置放置了棋子 其左上角和右上角不能放置棋子

主要**如下

bool check

(int st1,int st2)

}return

true

;}

判斷二進位制位數**如下

int c

(int x)

return num;

}

整體實現**如下

#include.h>

using namespace std;

int n,k;

long long dp[10]

[1<<9]

[88];

//從左往右依次表示第i行放置情況為j的二進位制情況

//最後一位表示前i行一共放了多少個棋子

int c

(int x)

return num;

}bool check1

(int x)

//分析該行是否合法

return

true;}

bool check2

(int x,int x1)

//判斷當前行和前一行是否合法

}return

true;}

int main()

}}}}

long long ans=0;

for(int i=

0;i<(1

<;i++

) ans+=dp[n-1]

[i][k]

;printf

("%lld\n"

,ans)

;return0;

}

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

狀壓DP入門記錄

poj 3254 農場主john新買了一塊長方形的新牧場,這塊牧場被劃分成m行n列 1 m 12 1 n 12 每一格都是一塊正方形的土地。john打算在牧場上的某幾格里種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當貧瘠,不能用來種草。並且,奶牛們喜歡獨佔一塊草地的感覺,於是john不會選擇...