题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2669

题解:

容斥,DP,DFS

先看看 dp 部分:
首先呢,X的个数不会超过 8个
个数很少,所以考虑状压,把需要填 X的那几个位置状压为二进制10表示对应的那个X位置是否已经填数。
同时填的数互不重复,考虑从小填到大。
cnt[S] 表示除了不在集合 S 里的 X 位置及其周围的位置,剩下的位置个数
定义 dp[i][S]表示从小到大填数填完了i这个数,且已经填了的 S 这个集合里的 X 位置的方案数
转移:依次去填数 1~N*M,每次有两种选择:
1).把这个数填在 某个 X 位置(枚举一个 k表示第 k个 X 位置填当前数)
dp[i][S]+=dp[i-1][S^(1<<(k-1))]

2).把这个数填在非 X 位置,那么填的位置有 cnt[S]-(i-1) 种。
dp[i][s]+=dp[i-1][s]*(cnt[s]-(i-1)) (好好理解一下这个转移)

这样 dp 可以保证那些给出的 X 位置一定是局部最小值,
因为第二种转移的填数位置都不能填在还没有填数的 X 位置的周围。
所以就完了么?
当然还没有,尽管我们保证了给出的 X 位置一定是局部最小值,
但是没有保证非 X位置一定不是非局部最小值。即,求出来的 dp[N*M][all_S(全集)]的意思是至少all_S集合里的 X位置为局部最小值的方案数
所以容斥如下:
ANS = 至少多填了0个局部最小值的方案数(dp[N*M][all_S])
          -至少多填了1个局部最小值的方案数
         +至少多填了2个局部最小值的方案数
          -....+ ....
这些用于容斥的方案数的求法:
DFS 搜索出哪些非 X 位置还可以改为 X ,
然后对于每一种新的填法,去跑一遍上述的dp即可求得对应的方案数。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define _ % mod
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
const int mv[9][2]={{0,0},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
const int mod=12345678;
char mp[10][10];
int N,M,ANS;
int solve(){static bool vis[10][10];static int dp[30][1<<8],cnt[1<<8],x[10],y[10],tot,tmp;tot=0; memset(dp,0,sizeof(dp));for(int i=1;i<=N;i++)for(int j=1;j<=M;j++) if(mp[i][j]=='X') tot++,x[tot]=i,y[tot]=j;for(int s=0;s<1<<tot;s++){tmp=0; memset(vis,0,sizeof(vis));for(int i=1;i<=tot;i++) if(!(s&(1<<(i-1))))for(int k=0;k<9;k++)vis[x[i]+mv[k][0]][y[i]+mv[k][1]]=1;for(int i=1;i<=N;i++)for(int j=1;j<=M;j++) if(!vis[i][j]) tmp++;cnt[s]=tmp;}dp[0][0]=1;for(int i=1;i<=N*M;i++)for(int s=0;s<1<<tot;s++){dp[i][s]=(1ll*dp[i][s]+1ll*dp[i-1][s]*max(cnt[s]-(i-1),0)_)_;for(int k=1;k<=tot;k++) if(s&(1<<(k-1)))dp[i][s]=(1ll*dp[i][s]+dp[i-1][s^(1<<(k-1))])_;}return dp[N*M][(1<<tot)-1];
}
void dfs(int x,int y,int t){if(y==M+1){dfs(x+1,1,t);return;}if(x==N+1){int tmp=solve();if(t&1) tmp=(-1ll*tmp+mod)_;ANS=((1ll*ANS+tmp)_+mod)_;return;}dfs(x,y+1,t);bool fg=1;for(int k=0;k<9;k++) if(mp[x+mv[k][0]][y+mv[k][1]]=='X') fg=0;if(fg){mp[x][y]='X';dfs(x,y+1,t+1);mp[x][y]='.';}
}
int main()
{scanf("%d%d",&N,&M);for(int i=1;i<=N;i++) scanf("%s",mp[i]+1);dfs(1,1,0);printf("%d",ANS);return 0;
}

转载于:https://www.cnblogs.com/zj75211/p/8035053.html

●BZOJ 2669 [cqoi2012]局部极小值相关推荐

  1. P3160 [CQOI2012]局部极小值

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

  2. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

  3. BZOJ 2668: [cqoi2012]交换棋子

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 1112  Solved: 409 [Submit][Stat ...

  4. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

    problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...

  5. [CQOI2012]局部极小值

    嘟嘟嘟 谁说CQOI的题都是板儿题,我就觉得这题挺难的-- 看到数据范围这么小,就会想状压.然而\(2 ^ {28}\)肯定过不了.不过对于所有的极小值的格子,最多不会超过8个,所以我们状压选了哪些局 ...

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

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

  7. Java项目迁移到uap上_Tomcat启动,不能加载项目问题。

    [BZOJ-2669]局部极小值 状压DP + 容斥原理 2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 56 ...

  8. 灭霸消灭一般人口是随即的吗_是时候消灭皇家战斗风格了

    灭霸消灭一般人口是随即的吗 Fortnite was my first battle royale, as I'm sure it was for many. I thought at the tim ...

  9. 组合数学学习笔记(未完待续

    这学期学了不少组合数学,期末给他补完. 算法竞赛考得很多的部分啊 这个还是很重要的 在目前的算法竞赛中有三大计数考点 1)组合计数 2)线性计数 3)群论计数 其中群论计数比较困难,我又不知道什么是线 ...

最新文章

  1. 【C语言】一些简单编译错误或警告
  2. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(3)
  3. arm rtx教程_ARM RTX操作系统—Overview—Product Description
  4. oracle更新视图。
  5. 手机浏览器被强制跳转_Azure front door 强制http redirect to https
  6. 度量相似性数学建模_数学之美读书笔记
  7. CSS3实现的几个小loading效果
  8. php168 discuz论坛贴子调用设置,Z-blog调用Discuz论坛最新帖子的方法
  9. Python经典前端框架:Django,第一天【Django环境搭建】
  10. Javascript特效代码大全(420个)
  11. 打造你的微信自动回复智障机器人
  12. 线段树进阶之lazy思想及Java实现
  13. Java休眠睡眠方法
  14. Ubuntu20.04 + ROS Noetic 安装 Projectory Dave 仿真环境
  15. 清越科技将开启申购:预计募资约8亿元,高裕弟为实际控制人
  16. linux下好玩的文本工具-figlet
  17. 基因家族进化分析之DNA序列批量获取
  18. RT-Thread Studio学习 驱动攀藤PMS5003ST PM2.5传感器
  19. 人工智能正在改变音乐产业
  20. 蚂蚁金服收购Kakao,完善移动金融布局

热门文章

  1. python 代码-你见过哪些令你瞠目结舌的 Python 代码技巧?
  2. python语言入门m-Python学习基础篇 -1
  3. python绘制条形图-python 中条形图绘制
  4. python中怎么比较两个列表-Python3列表(list)比较操作教程
  5. python能在生活中做什么-Python可以解决哪些生活中的小问题
  6. python数据处理实例-python数据分析实例(1)
  7. java好还是python好-学Python 好还是java 好?
  8. python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现
  9. python安装包为什么这么小-python(x,y)安装好了为何还是加载不了包
  10. python掌握程度怎么判断-Python数据分析路上,温故而知新