题目描述

n

n

n*n

n∗n(

n

20

n≤20

n≤20)的方格棋盘上放置

n

n

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


输入

第一行为棋盘的大小

n

n

n
第二行为障碍的数量

m

m

m
第三行到第

m

+

3

m+3

m+3为

m

m

m个障碍


输出

总数


样例输入

4
2
1 1
2 2

样例输出

14

题目解析

首先,我们看题,想到可以用

D

P

DP

DP来做。以

f

[

i

]

[

j

]

f[i][j]

f[i][j]来储存位置

i

,

j

i,j

i,j的状态。
但考虑到要考虑到棋盘的状态,所以要用状压DP

状压DP是以DP为基础,将二维压至一维,转化为十进制存储至数组里
然后,我们将

f

[

i

]

[

j

]

f[i][j]

f[i][j]压至一维,并且以一个数值

p

[

i

]

p[i]

p[i]表示

2

2

2的

i

i

i次方
通过一个

a

a

a数组来表示障碍的状态。
通过一位巨佬的指教,我得出了一个转移

a

[

x

]

=

p

[

y

1

]

a[x]=p[y-1]

a[x]=p[y−1]
然后以一个c来记录当前的行数,得到状态转移方式

for(t=i & ~a[c];t;t-=t & (-t))
f[i]+=f[i^(t & (-t))];

(其中

1

1

1是不能放,表放过或有障碍;

0

0

0是可以放)


code

#include<stdio.h>

#include<iostream> 

using namespace std;

long long n,m,x,y,t,c;
long long a[25],p[25],f[1<<20]={1}; int main ()
{
scanf ("%lld%lld",&n,&m);
p[0]=1;
for (long long i=1;i<21;++i) p[i]=p[i-1]*2;
for (long long i=1;i<=m;++i)
{
scanf ("%lld%lld",&x,&y);
a[x]+=p[y-1];
}
for (long long i=1;i<p[n];++i)
{
for(c=0,t=i;t;t-=t & (-t))c++;
for(t=i & ~a[c];t;t-=t & (-t))
f[i]+=f[i^(t & (-t))];
}
printf ("%lld",f[p[n]-1]);
return 0;
}

[状压DP]车的更多相关文章

  1. [状压DP]车II

    车 I I 车II 车II 题目描述 有一个 n ∗ m n*m n∗m的棋盘 ( n . m ≤ 80 , n ∗ m ≤ 80 ) (n.m≤80,n*m≤80) (n.m≤80,n∗m≤80)要 ...

  2. 【POJ 2923】Relocation(状压DP+DP)

    题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...

  3. POJ2923--Relocation(01背包+状压dp)

    果然对状压DP,我根本就不懂=.= /************************************************** Problem: 2923 User: G_lory Mem ...

  4. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  5. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  6. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

  7. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  8. HDU 2923 Relocation(状压dp+01背包)

    题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...

  9. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

随机推荐

  1. flutter 1.5 in action

    flutter 1.5 in action https://flutter.dev/docs/get-started/flutter-for/react-native-devs https://flu ...

  2. flex layout & demos

    flex layout & demos https://codepen.io/xgqfrms/pen/jjLPKN https://css-tricks.com/snippets/css/a- ...

  3. NGK生态之星空计划启动在即,稀有VAST高兑换比带来高价值!

    NGK生态之星空计划启动在即,为了感谢NGK布道者的支持,NGK官方将全力辅助算力市场,开展全新的星空计划,并发行星空币SPC,空投给算力持有者进行额外奖励. 至此,SPC已经顺利完成2轮空投,也初步 ...

  4. Linux零拷贝技术

    本文转载自Linux零拷贝技术 导语 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较 ...

  5. dev 控件获得所有的EFDEVGRID

    //获得当前Grid DevExpress.XtraGrid.GridControlNavigator GCN2 = sender as DevExpress.XtraGrid.GridControl ...

  6. call、apply和bind的实现

    call方法 基础版, 只能修改指向,不能传参 Function.prototype.myCall = function(context) { // 获取调用者,这里为bar context.fn = ...

  7. docker数据卷的操作

    一般情况下会比较频繁的修改容器内部的文件 频繁docker cp 不太方便 使用数据卷可以将宿机的某个目录映射至容器的目录 修改会方便点 1.创建数据卷 docker volume create 数据 ...

  8. ZooKeeper未授权访问漏洞确认与修复

    目录 探测2181 探测四字命令 用安装好zk环境的客户端连接测试 修复 修复步骤一 关闭四字命令 修复步骤二 关闭未授权访问 zookeeper未授权访问测试参考文章: https://www.cn ...

  9. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  10. pyhont+unittest的测试固件

    在执行一条自动化测试用例时需要做一些测试前的准备工作和测试后的清理工作,如:创建数据库链接.启动服务进程.打开文件.打开浏览器.测试环境的清理.关闭数据链接.关闭文件等.如果每执行一条用例都需要编写上 ...