互不侵犯King(SCOI2005)

2021-05-28 10:26:15 字數 961 閱讀 5207

演算法:位運算+dp

分析:不少人看到這道題的第一思路大概都是搜尋吧,我也不例外,其實可以用乙個狀態壓縮。

設當前位置放置國王為1,不放置為0,通過讀題不難得出一定不能出現連續的1,否則國王會被吃掉。因此我們預處理哪兩種狀態不能同時成立,最後列舉一下就能算出哪些能成立。

用f[i,j,k]表示前i行第i行的狀態為j,放置了k個國王的種類數,最後我們統計一下f[n,i,m]即可(0<=i<=(1 shl n)-1)。

program bzoj1087; 

const

maxn=100;

maxk=100;

maxm=600;

varans:int64;

n,m,zt:longint;

f:array [0..maxn,0..maxm,0..maxk] of longint;

b:array [0..maxm,0..maxm] of boolean;

function can1(x:longint):boolean;

var i:longint;

s:ansistring;

begin

s:=binstr(x,n);

for i:=1 to n do if (s[i]='1') and (((s[i]=s[i-1]) and (i>1)) or ((s[i]=s[i+1]) and (i=calc(j)) then

inc(f[i,j,l],f[i-1,k,l-calc(j)]);

end;

end;

end;

end;

for i:=0 to zt do inc(ans,f[n,i,m]);

end;

begin

init;

main;

writeln(ans);

end.

題解 互不侵犯

僅僅是筆者對於狀態壓縮類 dp 的初步練習吧。題目鏈結 題目大意 給定乙個 n n 的棋盤,在棋盤上放國王,國王的攻擊範圍是它周圍的八個格仔。求放 k 個國王的合法方案數。本題很像八皇后問題,但是由於搜尋狀態數量太多導致搜尋會超時。我們考慮一下 dp 先考慮狀態設計 裡面首先要包含當前使用的國王數,...

2019 8 31 互不侵犯

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。注 資料有加強 2018 4 25 只有一行,包含兩個數n,k 1 n 9,0 k n n 所得的方案數 輸入 1複製 3 2 輸出 1複製 16 題...

scoi 互不侵犯 king

time limit 10 sec memory limit 162 mb 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。只有一行,包含兩個數n,k 1 n 9,0 k n n 方案數。3 216...