【状压dp】bzoj1087 || scoi2005互不侵犯

1087: [SCOI2005]互不侵犯King

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 1202   Solved: 697
[ Submit][ Status]

Description

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

Input

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

Output

方案数。

Sample Input

3 2

Sample Output

16


我大四川05年的省选题,高二的时候做过,当时折腾得啊……虽然今天也被虐得不轻,但是比那时确实有进步!!
做过的题再做的一大弊端就是思路什么的已经早就知道了
状压dp
f【i】【j】【k】 表示第i行的状态为k 且已经放了j个国王的方案数
转移方程应该为
f[i][j][k] += f[i - 1][j - num[k]][p] (num[k]表示k状态的国王数)
再次提醒边界——注意要保证j - num[k]>0 不然就访问无效内存了,可能就会出现意想不到的后果哦
还有,事实证明要爆long 所以记得用longlong!!


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long n, k, m;
long state[600][2];
long long f[20][100][600];
long cala(long x)
{
	long sum = 0;
	while (x > 0)
	{
		if ((x & 1) == 1) sum++;
		x >>= 1;
	}
	return sum;
}
int main()
{
	//freopen("king.in", "r", stdin);
	scanf("%d%d", &n, &k);
	m = 0;
	long r = ((1 << n) - 1);

	for (long i = 0; i <= r; i++)
	{
		if ((i & (i >> 1)) == 0)
		{
	        long tmp = cala(i);
			if (tmp <= k)
			{
				m++;
				state[m][0] = i;
				state[m][1] = tmp;
			}
		}
	}
	memset(f, 0, sizeof(f));
 	for (long i = 1; i <= m; i++)
	{
		f[1][state[i][1]][i] = 1;
	}
	for (long i = 2; i <= n; i++)
	{
	    for (long j = 0; j <= k; j++)
	    {
			for (long p = 1 ; p <= m; p++)
			for (long q = 1 ; q <= m; q++)
			{
			    if ((state[p][0] & state[q][0]) != 0) continue;
			    if ((state[p][0] & (state[q][0] << 1)) != 0) continue;
			    if ((state[p][0] & (state[q][0] >> 1))  != 0) continue;
				if ((j - state[q][1]) >= 0)
				{
					f[i][j][q] += f[i - 1][j - state[q][1]][p];
					//cout << i<<' ' <<j <<' '<<q <<' '<< f[i][j][q]<< endl;
				}
			}
	    }
	}
	long long re = 0;
	for (long i = 0; i <= m; i++)
	{
		re += f[n][k][i];
	}
	cout << re << endl;
    return 0;
}


全部评论
果然还是看代码好懂点哈哈
点赞
送花
回复
分享
发布于 2021-02-05 09:48

相关推荐

1 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1150957次浏览 17147人参与
# 通信和硬件还有转码的必要吗 #
11181次浏览 101人参与
# OPPO开奖 #
19187次浏览 267人参与
# 和牛牛一起刷题打卡 #
18840次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203333次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4959次浏览 30人参与
# 不去互联网可以去金融科技 #
20304次浏览 255人参与
# 通信硬件薪资爆料 #
265864次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2207次浏览 34人参与
# 互联网公司评价 #
97661次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25033次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454786次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53892次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14631次浏览 349人参与
# 硬件人的简历怎么写 #
82283次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19386次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28012次浏览 248人参与
# 学历对求职的影响 #
161207次浏览 1804人参与
# 你收到了团子的OC了吗 #
538651次浏览 6386人参与
# 你已经投递多少份简历了 #
344144次浏览 4963人参与
# 实习生应该准时下班吗 #
96957次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63514次浏览 622人参与
牛客网
牛客企业服务