题目

P3160 [CQOI2012]局部极小值

一眼就是状压,接下来就不知道了\(qwq\)

做法

我们能手玩出局部小值最多差不多是\(8,9\)个的样子,\(dp_{i,j}\)为填满\(1~i\)数字,局部小值的状态为\(j\)

第\(k\)个局部极小值填\(i\):\(dp[i][j]=(dp[i][j]+dp[i-1][j^(1<<k-1)])%p\)

不填在局部极小值,显然有些地方不能填\(i\)的,首先还没填的局部极小值不填,其周围也不能填(填\(i\)后后面再填比不符合局部极小值)
我们预处理出每种状态不能填时的位置:\(dp[i][j]=(dp[i][j]+dp[i-1][j]*max(num[j]-i+1,0))%p\)

一顿操作后发现WA了,我们得到的局部极小值可能不是恰好是给出的\(X\)(更多)

容斥原理:Ans=至少多0个极小值-至少多1个极小值+至少多两个极小值......

理解:至少多0个\((x,x+1,x+2,x+3...)-k(x+1,x+2,x+3...)\)其中\(k\)为某些值的系数
填了至少多0个极小值后,有多填的部分那就得减去至少多1个极小值,至少多1个极小值的位置也有很多,就会有一些位置减掉的系数为(k>1),就要又加上

\(dfs\)时加上能被多余的极小值填上的地方换成'X',然后多次做\(dp\)

My complete code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn=31;
const int p=12345678;
const int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};
int n,m,tot;
LL ans;
int x[maxn],y[maxn],num[1<<9],dp[maxn][1<<9];
bool visit[maxn][maxn];
char s[maxn][maxn];
inline int Solve(){tot=0;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if (s[i][j]=='X')x[++tot]=i,y[tot]=j;int Up=1<<tot;for(int i=0;i<Up;i++){int cnt(0);memset(visit,0,sizeof(visit));for(int j=1;j<=tot;++j)if(!((i>>(j-1))&1)){visit[x[j]][y[j]]=1;for(int k=0;k<8;++k){int xx=x[j]+dx[k];int yy=y[j]+dy[k];if(xx>0&&yy>0&&xx<=n&&yy<=m)visit[xx][yy]=1;}}for(int j=1;j<=n;++j)for(int k=1;k<=m;++k) if(visit[j][k])  ++cnt;num[i]=n*m-cnt;}memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n*m;++i)for(int j=0;j<Up;++j){dp[i][j]=(dp[i][j]+dp[i-1][j]*max(num[j]-i+1,0))%p;for(int k=1;k<=tot;k++)if(j&(1<<(k-1)))dp[i][j]=(dp[i][j]+dp[i-1][j^(1<<k-1)])%p;}return dp[n*m][Up-1];
}
void Dfs(int x,int y,int k){if(y==m+1){Dfs(x+1,1,k);return;}if(x==n+1){ans=(ans+(((k&1)==0)?1:-1)*Solve()+p)%p;return;}Dfs(x,y+1,k);if(s[x][y]!='X'){bool f=true;for(int i=0;i<8;i++)if(s[x+dx[i]][y+dy[i]]=='X'){f=false;break;}if(f){s[x][y]='X',Dfs(x,y+1,k+1),s[x][y]='.';}}
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf(" %s",s[i]+1);Dfs(1,1,0);printf("%lld\n",ans);return 0;
}
/*
5 5
.....
...X.
.X...
.....
....X
*/

转载于:https://www.cnblogs.com/y2823774827y/p/10262116.html

P3160 [CQOI2012]局部极小值相关推荐

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

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

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

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

  3. [CQOI2012]局部极小值

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

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

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

  5. P3160:局部极小值(容斥、状压)

    解析 又是一道我不会的容斥题 qwq 本题的一个关键性质:答案有解时,极小值不超过8个 所以可以对其进行状压 考虑从小到大填数 那么在极小值填完之前,它的八连通必然是不能填的 设计dpi,sdp_{i ...

  6. 2019.2-2019.3 TO-DO LIST

    DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...

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

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

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

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

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

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

最新文章

  1. python获取文件路径
  2. iptables中state模块的连接状态
  3. python3生成随机数_Python3.3中如何产生伪随机数
  4. HTML实现包含公共部分:通过ECMA6的模块化,纯前端实现类似jsp:include的功能
  5. Java教程:SpringBoot常用配置
  6. 电信信息日志使用mapreduce统计的两种方式
  7. 远控免杀5---Veil免杀
  8. 云计算技术的跃进睿云智合专业先进水平
  9. 实验七-卷积编码的MATLAB实现
  10. IM多点登录与消息漫游架构随想
  11. Spring 缓存大法
  12. 006Python-Re库入门(正则表达式)
  13. 一个程序媛的古北水镇游览攻略
  14. 小米盒子,一个说皇帝没穿衣服的小孩
  15. 【摘抄】放弃表达的瞬间
  16. 我的ubuntu(持续更新中)
  17. 2020年阴历三月初一 投资理财~有些大v要警惕
  18. Python diag函数
  19. Inconsistent namespace mapping properties. Cannot initiate connection as SYS
  20. Human vs AI,人类和机器的学习究竟谁更胜一筹?

热门文章

  1. ART、JIT、AOT、Dalvik之间有什么关系?
  2. 又一个半成品库 weblog rpc client
  3. perform update operations on columns of type JSONB
  4. 如何把Excel的多张表格合成一张
  5. javascript简易缓动插件
  6. 看贴回帖 感受与感动
  7. LeetCode 5352. 生成每种字符都是奇数个的字符串
  8. TCP/IP网络编程(2)
  9. socket bufferedinputstream通信读取不到服务器返回的响应_TCP角度看socket通信过程,socket怎么表示三次握手,四次挥手...
  10. python3九九乘法表儿歌_python3: 简单4步骤输出九九乘法表