BZOJ1087 互不侵犯king(狀壓DP)

2021-08-09 04:51:40 字數 791 閱讀 4567

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

題解:看n的範圍1<=n<=9,大概就是狀壓dp了。把行的放法壓起來,狀態還是比較好想的。

f[i][j][now]表示前i行一共放了j個king,並且第i行的放法為now時的方案總數,轉移方程就容易得到了,再加c1,c2,cnt 預處理放法是否可行以及每種放法用了多少個king (詳見**)。

code

#include

#include

#include

#include

#include

using

namespace

std;

int n,m,all,cnt[515];

long

long f[10][100][515],ans;

bool c1[515],c2[515][515];

void pre()

for (int i=0;i<=all;i++)

if (c1[i])

for (int j=0;j<=all;j++)

if (c1[j])

if (((i&j)==0)&&((i&(j>>1))==0)&&((j&(i>>1))==0))

c2[i][j]=1; // i、j兩行相鄰可行

}int main()

BZOJ 1087, 互不侵犯

傳送門 給定一張大小為n n的棋盤,要求放置k個棋子,其中,棋子上下左右以及左上 左下 右上和右下八個位置不得有其它棋子存在。求合法方案數。動態規劃。狀態數很多,可以先預處理出一行的合法放置方案,再處理出上一行放置的情況下,下一行哪些方案是可行的,於是一行一行轉移即可。運用位運算優化預處理,後來四重...

BZOJ 1087( ) 互不侵犯

1087 scoi2005 互不侵犯king time limit 10 sec memory limit 162 mb submit 5333 solved 3101 submit status discuss description 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方...

BZOJ 1087 互不侵犯King

1087 scoi2005 互不侵犯king time limit 10 sec memory limit 162 mb description 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上 左下右上右下八個方向上附近的各乙個格仔,共8個格仔。i...