http://www.lydsy.com/JudgeOnline/problem.php?id=2669 (题目链接)

题意

  给出一个$n*m$的整数矩阵,其中$[1,nm]$中的整数每个出现一次,有一些位置为局部最小值。问方案数。

Solution

  好神的dp啊。

  http://blog.csdn.net/popoqqq/article/details/48028773

  $cnt_j$表示的是,在局部最小值被填充的状态为$j$的情况下,目前有多少个位置可以填,这些位置中包括已经被填了数的位置。

细节

  最后加模再取模

代码

// bzoj2669
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define MOD 12345678
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; int xx[9]={0,-1,-1,-1,0,1,1,1,0};
int yy[9]={1,1,0,-1,-1,-1,0,1,0};
int f[30][1000],cnt[1000],fil[10][10],bin[30],ans,n,m;
pair<int,int> t[10];
char s[10][10]; int dp() {
memset(f,0,sizeof(f));
memset(cnt,0,sizeof(cnt));
int top=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) if (s[i][j]=='X') t[++top]=pair<int,int>(i,j);
for (int i=0;i<bin[top];i++) {
memset(fil,0,sizeof(fil));
for (int j=1;j<=top;j++) if (!(i&bin[j-1])) fil[t[j].first][t[j].second]=1;
for (int j=1;j<=n;j++)
for (int l,k=1;k<=m;k++) {
for (l=0;l<9;l++) if (fil[j+xx[l]][k+yy[l]]) break;
if (l==9) cnt[i]++;
}
}
f[0][0]=1;
for (int i=1;i<=n*m;i++)
for (int j=0;j<bin[top];j++) {
(f[i][j]+=f[i-1][j]*max(0,cnt[j]-i+1))%=MOD;
for (int k=1;k<=top;k++)
if (bin[k-1]&j) (f[i][j]+=f[i-1][j^bin[k-1]])%=MOD;
}
return f[n*m][bin[top]-1];
}
void dfs(int x,int y,int c) {
if (x==n+1) {(ans+=dp()*(c&1 ? -1 : 1))%=MOD;return;}
if (y==m) dfs(x+1,1,c);
else dfs(x,y+1,c);
int k;
for (k=0;k<9;k++) if (s[x+xx[k]][y+yy[k]]=='X') break;
if (k==9) {
s[x][y]='X';
if (y==m) dfs(x+1,1,c+1);
else dfs(x,y+1,c+1);
s[x][y]='.';
}
}
int main() {
bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%s",s[i]+1);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (s[i][j]=='X')
for (int k=0;k<8;k++) if (s[i+xx[k]][j+yy[k]]=='X') {puts("0");return 0;}
dfs(1,1,0);
printf("%d\n",(ans+MOD)%MOD);
return 0;
}

【bzoj2669】 cqoi2012—局部极小值的更多相关文章

  1. [BZOJ2669] [cqoi2012]局部极小值

    [BZOJ2669] [cqoi2012]局部极小值 Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  2. bzoj2669[cqoi2012]局部极小值 容斥+状压dp

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 774  Solved: 411[Submit][Status ...

  3. BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所 ...

  4. [BZOJ2669][CQOI2012]局部极小值:DP+容斥原理

    分析 题目要求有且只有一些位置是局部极小值.有的限制很好处理,但是只有嘛,嗯...... 考虑子集反演(话说这个其实已经算是超集反演了吧还叫子集反演是不是有点不太合适),枚举题目给出位置集合的所有超集 ...

  5. bzoj2669 [cqoi2012]局部极小值 状压DP+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...

  6. 【BZOJ-2669】局部极小值 状压DP + 容斥原理

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 561  Solved: 293[Submit][Status ...

  7. bzoj 2669 [cqoi2012]局部极小值 DP+容斥

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 838  Solved: 444[Submit][Status ...

  8. 【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 667  Solved: 350 Description 有一 ...

  9. P3160 [CQOI2012]局部极小值

    题目 P3160 [CQOI2012]局部极小值 一眼就是状压,接下来就不知道了\(qwq\) 做法 我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\ ...

  10. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

随机推荐

  1. 20155323刘威良《网络对抗》Exp4 恶意代码分析

    20155323刘威良<网络对抗>Exp4 恶意代码分析 实践目标 1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...

  2. Android开发——高斯模糊效果的简单实现

    0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1.  高斯模糊效果实现 Bit ...

  3. Bluedroid协议栈HCI线程分析

    蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...

  4. [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]

    题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...

  5. NetBeans的(默认)快捷键

    NetBeans的(默认)快捷键 1.完成代码:ctrl+\ //任何地方按下此组合键,均会提示相应的参考字段:  2.错误提示:alt + enter //顾名思义,当系统报错时,按下此组合可以查看 ...

  6. Js_特效II

    字号缩放 让文字大点,让更多的用户看的更清楚.(也可以把字体变为百分比来实现)<script type="text/javascript">  function doZ ...

  7. 【原创】CA证书申请+IIS配置HTTPS+默认访问https路径

    一.CA证书申请 (一). 新StartSSL注册帐号 1.    StartSSL官网 官方网站:https://www.startssl.com/ 2.    进入到StartSSL后,直接点击注 ...

  8. Linux下tomcat的启动,关闭,以及shutdown失败杀死进程的方法

    1.tomcat服务器第一次启动并查看启动日志的命令 在 ../bin 文件夹下输入./startup.sh;tail -f ../logs/catalina.out 2.需要重启服务器的时候 在 . ...

  9. Word或者WPS里证件照的背景底色和像素调整

    证件照的背景底色调整和像素调整         关于证件照的背景底色自行调整,比较方便的方法是用Word或者WPS来进行调整,当然也可以利用两者相结合的方法来进行调整,下面来系统的说一下这两种方式.此 ...

  10. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...