正解:状压$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. python基础---集合类型(Sets)

    集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合.常见用法包括:成员关系测试.移除序列中的重复.以及科学计算,例如交集.并集.差分和对称差分.通俗点来说,集合是一个无序 ...

  2. @bzoj - 4380@ [POI2015] Myjnie

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 家洗车店从左往右排成一排,每家店都有一个正整数价格 p[ ...

  3. shell 并发执行任务

    #!/bin/bash # ref: https://blog.csdn.net/spch2008/article/details/51433353 token(){ pid=$ # 判断是否有传入p ...

  4. H3C IP 地址格式和表示方法

  5. oracle 基础表的选择

    基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的. 如果你使用的是CBO (COST BASED OPTI ...

  6. centos6 名字服务dnsmasq配置

    1 主机名配置 主机hd1配置(后面配置为名字服务器) [grid_hd@hd1 Desktop]$ cat /etc/sysconfig/network NETWORKING=yes HOSTNAM ...

  7. 基于ThinkPHP与阿里大于的PHP短信验证功能

    https://blog.csdn.net/s371795639/article/details/53381274 PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定A ...

  8. 手风琴jq实现

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

  9. Springboot 2.x下多数据源配置

    本文同样适用于2.x版本下Mybatis的多数据源配置 项目中经常会遇到一个项目需要访问多个数据源的情况,多数情况下可以参考这个教程进行配置. 不过该教程适合springboot1.x版本,由于2.x ...

  10. 2018-4-29-C#-金额转中文大写

    title author date CreateTime categories C# 金额转中文大写 lindexi 2018-04-29 09:50:38 +0800 2018-04-02 21:4 ...