P1896 SCOI2005 互不侵犯King

2022-05-14 01:07:40 字數 1102 閱讀 7412

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

輸入格式:

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

輸出格式:

所得的方案數

輸入樣例#1:

3 2

輸出樣例#1:

16

用二進位制壓縮狀態,dp

#include#include

#include

#include

#include

#include

using

namespace

std;

int c[1500],f[50][2000][2000

],n,k,all;

bool f1[2000],f2[2000][2000

];void

first()

for(int i=0;i)

if(f1[i])

for(int j=0;j)

if(f1[j])

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

) f2[i][j]=true;}

intmain()

all= 1

for(int i=0;i0][c[i]][i]=1

;

inti,j,k1,p;

for(i=1;i)

for(j=0;jif

(f1[j])

for(k1=0;k1if

(f2[j][k1])

for(p=c[j];p+c[k1]<=k;p++)

f[i][p+c[k1]][k1]+=f[i-1

][p][j];

int ans=0

;

for(i=0,n--;if[n][k][i];

cout

}

P1896 SCOI2005 互不侵犯

p1896 scoi2005 互不侵犯 資料不大,時間複雜度很高也差不多能過。使用狀壓dp dp i j k 表示到第i行,狀態為j,選了k個人 然後就是轉移,轉移的難點就是快速判斷 判斷的話,我們整體考慮。然後乙個狀態是否有相鄰的國王。用它本身按位與它本身右移 左移 若結果為0,則說明無相鄰的國王...

P1896 SCOI2005 互不侵犯

首先,養成乙個思路 資料這麼小?狀壓dp!然後翻題解可以這麼定義狀態 定義 dp i j k 為前 i 行中,第 i 行狀態為 j 前 i 行已放置 k 個國王的方案數。顯然一行的狀態只與前一行的有關,所以只需要記錄一行的狀態。但是一行的狀態好像很難存啊!難道複製乙個陣列進去嗎?其實,對於每乙個點,...

P1896 SCOI2005 互不侵犯

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