bzoj1087/scoi2005 互不侵犯

题目描述

在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。

输入格式

只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

输出格式

所得的方案数

输入输出样例
输入 #1

3 2

输出 #1

16

分析

分析就不分析了吧,这题简直就是炮兵阵地的弱化版套上个背包啊。我直接贴代码吧。

代码如下

#include <bits/stdc++.h>
#define N 10
#define LL long long
using namespace std;
int sta[105], ret, cnt[105];
LL f[N][105][105], ans;
int w(int x){
	int s = 0;
	while(x){
		s++;
		x -= x&-x;
	}
	return s;
}
int main(){
	int i, j, t, n, m, k, z, a, b;

	scanf("%d%d", &n, &k);
	for(i = 0; i < (1 << n); i++){
		if(!(i & (i >> 1))){
			sta[++ret] = i;
			cnt[ret] = w(i);
		}
	}
	f[0][1][0] = 1;
	for(i = 1; i <= n; i++){
		for(j = 1; j <= ret; j++){
			if(cnt[j] > k) break;

			a = sta[j];

			for(t = 1; t <= ret; t++){
				b = sta[t];
				if(!(a & b) && !(a & (b << 1)) && !(a & (b >> 1))){
					for(z = k; z >= cnt[t]; z--){
						f[i][t][z] += f[i-1][j][z - cnt[t]];
					}
				}
			}
		}
	}
	for(i = 1; i <= ret; i++) ans += f[n][i][k];
	printf("%lld", ans);
	return 0;
} 
各种题解及学习笔记~ 文章被收录于专栏

各种题解及学习笔记

全部评论

相关推荐

丿南烟丶:黑白模板吧,不要这样花哨的。 主要成就太空了,和获奖融在一起,写一两行就行了。 职业技能不要这样排,就传统的掌握精通什么什么然后举例补充的一些重要技术点。 自我介绍说实话也没啥用,可以删了。 把自己的两个项目方案细节补充上去,为什么这样设计,怎么设计,成果是什么按star法则来写 你要引导面试官来问你的技能和项目,你的获奖和自我介绍别人可能看都不看一眼或者不太在乎,重要的是展示你能干活的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务