【SSL_1382】车


Description

在n*n(n≤20)的方格棋盘上放置n个车(可以攻击所在行、列),有些格子不能放,求使它们不能互相攻击的方案总数。

Input

第一行为棋盘的大小n
第二行为障碍的数量m
第三行到第m+3为m个障碍

Output

总数

Sample Input

4
2
1 1
2 2

Sample Output

14

解题思路

这是一道 状态压缩动态规划 模板题,所谓 状态压缩 ,就是用一个二进制数表示一个状态,比如 10100 就表示第一位和第三位放的情况,然后我们就可以DP啦(说的一点都不清楚…
下附代码:

#include<iostream>
#include<cstdio>
using namespace std;

long long n,m,a[30],hh[30]={
    
    1},f[1<<20]={
    
    1};

int main()
{
    
    
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
		hh[i]=hh[i-1]*2;
	for(long long i=1;i<=m;i++)
	{
    
    
		int x,y;
		scanf("%d%d",&x,&y);
		a[x]+=hh[y-1]; 
	}
	for(long long i=1;i<hh[n];i++)
	{
    
    
		int c=0;
		for(long long t=i;t;c++,t-=t&(-t));
		for(long long t=i&~a[c];t;t-=t&(-t))
			f[i]+=f[i^(t&(-t))];
	}
	cout<<f[hh[n]-1]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_guyixin/article/details/108092978
SSL