正解:状压$dp$

解题报告:

传送门!

什么神仙题昂,,,反正我是没有想到$dp$的呢$kk$,,,还是太菜了$QAQ$

首先看数据范围,一个4×7的方格,不难想到最多有8个局部极小值,过于显然懒得证了$QwQ$

然后因为它对相对位置大小有要求,于是考虑按大小顺序枚举

这里考虑从小到大枚举好了$QwQ$

设$f_{i,j}:$枚举到第$i$个数,局部极小值的状态为$j$的方案数

转移显然就两种

第一种是,放到局部极小值的位置,有$f_{i,j+2^{k}}+=f_{i-1,j}$

第二种是,不放到局部最小值的位置,此时显然必须保证的是这个位置附近没有未填入的局部最小值的位置了,这个可以考虑先预处理出$g_{i}$表示局部极小值的状态为$i$时能填入的位置数量,有$f_{i,j}+=f_{i-1,j}\cdot g_{j}$

这时候要意识到一个问题_(:з」∠)_

就,因为它给的是所有局部最小值的位置,所以要考虑到,可能因为填法的不同,出现新的局部最小值的情况$QAQ$

这种显然一个容斥可以搞定,就再找出所有可能成为局部最小值而实际却并不是的位置,容斥掉就好$QwQ$

代码是不会有代码的$QAQ$

$over$

啊对了,发现这题还有个双重经验$QwQ$,也是黑的嘻嘻

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=,mod=;
int n,m,f[N*N][<<N],g[<<N],as,mvx[]={-,-,-,,,,,},mvy[]={-,,,-,,-,,},cnt,S;
bool mn[N][N],used[N][N];
char str[N];
struct node{int x,y;}nod[N*N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int dp()
{
cnt=;memset(g,,sizeof(g));memset(f,,sizeof(f));
rp(i,,n)rp(j,,m)if(mn[i][j])nod[++cnt]=(node){i,j};S=<<cnt;
rp(i,,S-)
{
ri num=;memset(used,,sizeof(used));
rp(j,,cnt)
if(!((<<(j-))&i))
{
ri x=nod[j].x,y=nod[j].y;
if(!used[x][y])used[x][y]=,++num;
rp(k,,){ri tx=x+mvx[k],ty=y+mvy[k];if(tx && ty && tx<=n && ty<=m && !used[tx][ty])used[tx][ty]=,++num;}
}
g[i]=n*m-num;
}
f[][]=;
rp(i,,n*m)
{
rp(j,,S-)
{
(f[i][j]+=f[i-][j]*max(g[j]-i+,)%mod)%=mod;
rp(k,,cnt)if(!((<<(k-))&j))(f[i][j+(<<(k-))]+=f[i-][j])%=mod;
}
}
return f[n*m][S-];
}
void dfs(ri x,ri y,ri opt)
{
if(y>m)y=,++x;if(x>n)return void((as+=opt*dp())%=mod);
dfs(x,y+,opt);if(mn[x][y])return;
rp(i,,){ri tx=x+mvx[i],ty=y+mvy[i];if(!tx || !ty || tx>n || ty>m)continue;if(mn[tx][ty])return;}
mn[x][y]=;dfs(x,y+,opt*-);mn[x][y]=;
} int main()
{
//freopen("3160.in","r",stdin);freopen("3160.out","w",stdout);
n=read();m=read();rp(i,,n){scanf("%s",str+);rp(j,,m)mn[i][j]=str[j]=='X';}
dfs(,,);printf("%d",(as%mod+mod)%mod);
return ;
}

洛谷$P$3160 局部极小值 $[CQOI2012]$ 状压$dp$的更多相关文章

  1. war2 洛谷模拟赛day2 t3 状压

    (new )   war2 题解:总体数据而言,我们很容易想到着就是DP啊,我们DP数组,用状态压缩,代表有那些点已经被占领过了,代表上一次我占的是那个.对于每一次状态转移,若当前我们要占领的Port ...

  2. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  3. 洛谷P2831 愤怒的小鸟——贪心?状压DP

    题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...

  4. 洛谷P2051 [AHOI2009] 中国象棋(状压dp)

    题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...

  5. K - Painful Bases 状压dp

    Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...

  6. 二:状压dp

    一:状压dp的基本特征 状态压缩问题一般是指用十进制的数来表示二进制下的状态 这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩. 常用到位运算 二:位运算 &:与运 ...

  7. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  8. 洛谷P4289 移动玩具 HAOI2008 搜索+状压

    正解:状压 解题报告: 先,放下传送门QwQ 说真的我jio得这题不管是思路还是实现上,都还是有一定难度的?然后就看到神仙hl博客里一句"太水了不讲了"就过掉了,,,好的趴太强辽Q ...

  9. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

随机推荐

  1. @codeforces - 1086F@ Forest Fires

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个无穷大的方格图,每个方格内都种了棵树. 一开始点燃了 n 棵 ...

  2. 2018-8-10-添加右键使用-SublimeText-打开

    title author date CreateTime categories 添加右键使用 SublimeText 打开 lindexi 2018-08-10 19:16:52 +0800 2018 ...

  3. 【原生JS】图片预加载之有序预加载

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  4. Json --- Jackson工具

    一.Jackson简介 Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson ...

  5. Python--day60--一个简单(不完整)的web框架

  6. Java中的元注解

    注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据. 通过使用注解,我们可以将这些元数据保存在Java源代码中,并利用annotation API为自己的 ...

  7. 【js】vue 2.5.1 源码学习(二) 策略合并

     一.  整体思路     1 首先是代码的大体构造,先判断引入代码的环境,即对应amd 和cmd的处理     2 vue_init 需要借助 initMinxin    ==>>> ...

  8. 2019-4-10-win10-uwp-自定义标记扩展

    title author date CreateTime categories win10 uwp 自定义标记扩展 lindexi 2019-04-10 09:46:13 +0800 2019-04- ...

  9. Google Java编程风格指南(中文+原始)

    目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...

  10. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(6)之配置文件设置

    现在该有的结构和层级都有了,下面我们就开始实际应用,首先把需要用的js,css,图片放到Content文件夹中. 这里不详细讲解,大家可根据自己的实际情况,使用合适自己的前端框架,也可以点击下载本项目 ...