演算法:位運算+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...