scoi 互不侵犯 king

2021-06-22 19:57:38 字數 1345 閱讀 9654

time limit: 10 sec  

memory limit: 162 mb

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

只有一行,包含兩個數n,k ( 1 <=n <=9, 0 <= k <= n * n)

方案數。

3 216

完成情況(大視野測評)

這應該是我做的第二道狀壓dp了,聽說是入門題,但我高了很久,最終還是看受哥的部落格才懂的。。。。。。。。

用 f [ i ] [ j ] [ s ] 表示前 i 行 , 用了 j 個國王, 當前行狀態為 s 的方案數

那麼 f [ i ] [ j ] [ s ] = ∑ f [ i - 1 ] [ m ] [ st ];

至於狀態,由於只有2^9種,並不多,所以可以dfs預處理出所有的狀態

其他的不多說了,記得用long long

具體看**,注釋沒刪,怕自己以後看不懂了。。。。。。。

c++ ac code

#include#includeusing namespace std;  

const int n=10;

typedef long long ll;

int n,k;

ll f[n][n*n][1<>1,deep+1);

printf("%d",s&1);

} void dfs(int x,int s)

dfs(x+1,s<<1);

if((s&1)==0) dfs(x+1,(s<<1)+1);

} bool can(int s,int st)

} if(flag) return true;

else return false;

} int main()

} //for(int idx=1,s=a[idx];idx<=m;idx++,s=a[idx]) printf("%d ",f[n][k][s]);

ll res=0;

for(int idx=1,s=a[idx];idx<=m;idx++,s=a[idx]) res+=f[n][k][s];

cout<

bool can(int s,int st)

{ int s=s;

s=s|(s<<1)|(s>>1);

s=s&((1<

兩次成績:

SCOI2005 互不侵犯King

還是dp 狀態壓縮 貌似我寫的只有dp了吧。提交傳送門 這題狀態壓縮 列舉的是有多少個king。很不一樣。so。又是做了很久,還有2進製壓縮。dp方程還是很難。description 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方...

SCOI2005互不侵犯King

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

SCOI2005 互不侵犯King

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。by洛谷 顯然的棋盤模型的狀壓dp,故考慮對每行二進位制狀壓,狀壓為表示有無王的01串,再由題意得到如下的限制 於是對於限制一,可在預處理中實現 對於...