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串,再由題意得到如下的限制 於是對於限制一,可在預處理中實現 對於...