【CJOJ2499】【DP合集】棋盘 chess
Description
给出一张 n × n 的棋盘,格子有黑有白。现在要在棋盘上放棋子,要求:
• 黑格子上不能有棋子
• 每行每列至多只有一枚棋子
你的任务是求出有多少种合法的摆放方案。答案模 109+7109+7 。
Input
输入的第一行一个整数 n ( n ≤ 15) 。
接下来一个 n × n 的棋盘( 1 表示黑 ;0 表示白)。
Output
输出一行一个整数,表示合法方案数对 109+7109+7 取模后的结果。
Sample Input
12
000010000000
000000000000
000010011000
001000011011
011000100111
000010110000
101000010001
000001000000
110000000000
000000000010
010010110100
011010010100
Sample Output
349847765
题解
考虑N的范围小于15
可以采用状态压缩
设f[i][j]表示当前第i行,状态为j的方案数
很容易就能够推出转移方程:
f[i][j]=sum(f[i][j-(1<< k)])+f[i-1][j]
其中k满足g[i][j]非黑格子,并且j&(1<<k)不为0
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MOD 1000000007
inline int read()//只需要读入0或1
{
register char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
return ch-48;
}
int N,Ans;
int g[20][20];
int f[20][1<<20];
//f[i][j]表示当前第i行,摆放棋子的情况是j的摆放数
int main()
{
cin>>N;
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
g[i][j]=read();
f[0][0]=1;
for(int i=1;i<=N;++i)//枚举行数
{
for(int j=0;j<(1<<N);++j)//枚举当前状态
{
f[i][j]=f[i-1][j];//如果当前状态不放棋子,直接由上一状态转移
for(int k=0;k<N;++k)//枚举位置
{
if(((1<<k)&j)&&(!g[i][k+1]))//如果当前位置不是黑,并且在状态中放了这个棋子
f[i][j]=(f[i][j]+f[i-1][j-(1<<k)])%MOD;//状态转移
}
}
}
for(int i=0;i<(1<<N);++i)//统计答案
Ans=(Ans+f[N][i])%MOD;
printf("%d\n",Ans);
return 0;
}
【CJOJ2499】【DP合集】棋盘 chess的更多相关文章
- dp合集 广场铺砖问题&&硬木地板
dp合集 广场铺砖问题&&硬木地板 很经典了吧... 前排:思想来自yali朱全民dalao的ppt百度文库免费下载 后排:STO朱全民OTZ 广场铺砖问题 有一个 W 行 H 列的广 ...
- 9.15 DP合集水表
9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...
- 9.14 DP合集水表
9.14 DP合集水表 关键子工程 在大型工程的施工前,我们把整个工程划分为若干个子工程,并把这些子工程编号为 1. 2. --. N:这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某 ...
- 【DP合集】棋盘 chess
给出一张 n × n 的棋盘,格子有黑有白.现在要在棋盘上放棋子,要求: • 黑格子上不能有棋子 • 每行每列至多只有一枚棋子 你的任务是求出有多少种合法的摆放方案.答案模 109+7109+7 . ...
- 【CJOJ2498】【DP合集】最长上升子序列 LIS
题面 Description 给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列 ...
- CJOJ 【DP合集】最长上升序列2 — LIS2
题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...
- 【DP合集】tree-knapsack
Description 给出一个 N 个节点的有根树,点编号 1 ∼ N ,编号为 i 的点有权值 v i .请选出一个包含树根的,点数 不超过 K 的连通块,使得点权和最大. Input 输入的第一 ...
- 【DP合集】m-knapsack
给出 n 个物品,第 i 个物品有重量 w i .现在有 m 个背包,第 i 个背包的限重为 c i ,求最少用几个背 包能装下所有的物品. Input 输入的第一行两个整数 n, m ( n ≤ 2 ...
- 【DP合集】背包 bound
N 种物品,第 i 种物品有 s i 个,单个重量为 w i ,单个价值为 v i .现有一个限重为 W 的背包,求能容 纳的物品的最大总价值. Input 输入第一行二个整数 N , W ( N ≤ ...
随机推荐
- Windows 定时任务对数据库进行操作
定时对数据库进行操作可以用mysql的event事件来完成,但是只有mysql5.1后的才支持,所以有一定的局限性,也可以通过其他的mysql管理软件实现,而我发现Windows本身就有个定时任务的功 ...
- [Python Study Notes]计算cpu使用率
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- latex编辑器
\prod \left ( a b c \right ) http://latex.codecogs.com/eqneditor/editor.php
- 正则表达式的方法:replace,match,test(replace参数可以是回调函数)
1.replace: 作用对象:字符串 功能:用于替换字符串中的某些字符 参数:(1)正则表达式 (2)要替换的字符串 或者 回调函数 var str="1 2 3 4 5 6 7 8 9& ...
- Docker 入门之创建service(一)
在一个分布式应用中,我们把应用的不同层叫做"Services".比如,一个视频共享应用,它包含存储数据到数据库的服务,用户上载后后台进行的视频解码服务,前端服务等等. 然而,一个服 ...
- Yii2中把路由地址中的%2F改为/
第一步:找到/vendor/yiisoft/yii2/web/UrlManager.php 第二步:搜索$url = "$baseUrl?{$this->routeParam}=&qu ...
- Asp.Net Core Identity+EFCore + Mysql踩坑记录
搭建基础框架准备试试传说中的Identity,本以为很顺利,结果一路踩了N多坑 遂就把过程记录下来.方便自己以后查看,也希望能帮到遇到同样问题的朋友. 1.首先,引入Identity需要的类库,还有M ...
- CodeForces - 796C Bank Hacking
思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...
- AGC012 - E: Camel and Oases
原题链接 题意简述 沙漠中有个排成一条直线的绿洲,一头储水量为的骆驼. 骆驼有两个操作: 走到距离在V以内的一个绿洲. 飞到任意一个绿洲,但V减少一半.V=0时不能飞. 问骆驼依次从每个绿洲出发,能否 ...
- Ansible自动化运维笔记1(安装配置)
1.Ansible的安装 pip install ansible==1.9.1 ansible1.9.1版本依赖的软件有 Python2.6以上版本 paramiko模块 PyYAML Jinja2 ...