题目链接

(bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669
(luogu) https://www.luogu.org/problem/P3160

题解

这道题充分暴露了我的菜。。

显然两个局部极小值点不能相邻,所以最多有\(8\)个局部极小值。
然后考虑容斥掉.不能成为局部极小值的限制,那么就变成钦定某些位置一定是局部极小值,其余不限,求方案数。

然后这个可以状压DP,考虑从小到大加入每个数,然后就很好求了。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#include<vector>
using namespace std;const int P = 12345678;
const int dx[8] = {1,0,-1,0,1,1,-1,-1},dy[8] = {0,1,0,-1,1,-1,-1,1};
vector<int> kx,ky;
int bitcnt[(1<<8)+3];
char a[7][11];
char b[7][11];
int num[(1<<8)+3];
int dp[31][(1<<8)+3];
int n,m,cnt,ans;bool check(int x,int y,int typ)
{bool ret = true;for(int i=0; i<8; i++){int xx = x+dx[i],yy = y+dy[i];if(xx>0&&xx<=n&&yy>0&&yy<=m){if(typ==0) {if(a[xx][yy]=='X') {return false;}}if(typ==1) {if(b[xx][yy]=='X') {return false;}}}}return true;
}int calc()
{kx.clear(); ky.clear();for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){if(a[i][j]=='X') {kx.push_back(i); ky.push_back(j);}}}for(int i=0; i<(1<<kx.size()); i++){for(int j=0; j<kx.size(); j++){if(!(i&(1<<j))) {b[kx[j]][ky[j]] = 'X';}}num[i] = 0;for(int j=1; j<=n; j++){for(int k=1; k<=m; k++){bool ok = check(j,k,1);if((ok && a[j][k]!='X')) num[i]++;}}num[i] += bitcnt[i];for(int j=0; j<kx.size(); j++) {b[kx[j]][ky[j]] = '.';}}dp[0][0] = 1;for(int i=0; i<n*m; i++){for(int j=0; j<(1<<kx.size()); j++){if(dp[i][j]){dp[i+1][j] = (dp[i+1][j]+dp[i][j]*(num[j]-i))%P;for(int k=0; k<kx.size(); k++){if(!(j&(1<<k))){dp[i+1][j|(1<<k)] = (dp[i+1][j|(1<<k)]+dp[i][j])%P;}}}}}int ret = dp[n*m][(1<<kx.size())-1];for(int i=0; i<=n*m; i++) for(int j=0; j<(1<<kx.size()); j++) dp[i][j] = 0;return ret;
}void dfs(int x,int y,int dep)
{if(x==n+1){int tmp = calc();if((dep-cnt)&1) {ans = ans-tmp<0 ? ans-tmp+P : ans-tmp;}else {ans = ans+tmp>=P ? ans+tmp-P : ans+tmp;}return;}int xx = x,yy = y+1; if(yy>m) {yy = 1; xx++;}if(a[x][y]=='X'){bool f = check(x,y,0);if(f) {dfs(xx,yy,dep+1);}}else{a[x][y] = 'X';bool f = check(x,y,0);if(f) {dfs(xx,yy,dep+1);}a[x][y] = '.';dfs(xx,yy,dep);}
}int main()
{for(int i=1; i<(1<<8); i++) bitcnt[i] = bitcnt[i>>1]+(i&1);scanf("%d%d",&n,&m);for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) b[i][j] = '.';for(int i=1; i<=n; i++) scanf("%s",a[i]+1);for(int i=1; i<=n; i++){for(int j=1; j<=m; j++) {if(a[i][j]=='X') cnt++;}}if(cnt>8) {printf("0"); return 0;}dfs(1,1,0);printf("%d\n",ans);return 0;
}

BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)相关推荐

  1. P3160 [CQOI2012]局部极小值

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

  2. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

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

  3. BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)

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

  4. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

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

  5. ●BZOJ 2669 [cqoi2012]局部极小值

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分: 首先呢,X的个数不会超过 8个. 个 ...

  6. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  7. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  8. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  9. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...

最新文章

  1. 独家 | 如何“扰乱”科技巨头用来监视你的数据
  2. PXE BOOT DIY自己的网络启动工具集合
  3. 打死都要记住!微服务架构的常用设计模式!
  4. 7 天玩转 ASP.NET MVC — 第 6 天
  5. 数据结构与算法之RandomPool结构和岛问题
  6. 程序员的项目周期(表情包版)
  7. 三维空间两直线/线段最短距离、线段计算算法 【转】
  8. 如何对一个对象进行深拷贝
  9. 项目review会议的步骤_进行完美的30分钟会议的6个步骤
  10. c7中取4c语言编程软件,c语言编程软件_C语言编程
  11. 系统架构师成长之路(二)
  12. 15crmo焊接后多长时间探伤_焊工必看:掌握钢结构焊接最重要的10个知识,不愁拿不到高工资!...
  13. 2019牛客暑期多校训练营(第四场)K-number
  14. (转)我在赶集网的两个月(完整版)(一)
  15. 动态规划——硬币找零
  16. Pyinstaller打包过程中报错“AttributeError: 'str' object has no attribute 'items''”问题解决
  17. 配置zabbix当内存剩余不足10%的时候触发报警
  18. java一天一只顽猴想去从山脚_异乡苦境救顽猴
  19. 基金定投应该什么时候终止?
  20. 国家电网车辆智能车载终端4G全网通T-BOX 、车联网OBD终端、4G TBOX终端

热门文章

  1. 【完结】林轩田机器学习技法终章
  2. pl0源码(可在delphi7中运行)
  3. MySQL--数据库基础
  4. 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记
  5. 谷歌浏览器没法安装插件,提示程序包无效
  6. 双向循环链表的冒泡排序
  7. gateway集成sentinel实现网关限流
  8. DM8168评估板上供电电源的设计
  9. 网站架构相关PPT、文章整理(更新于2009-7-15)
  10. Integer overflow, simple but not easy