正解:状压$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. Jmeter If控制器

    "${xxx}"=="1" 或者 "${xxx}"!="2"

  2. @codeforces - 1096G@ Lucky Tickets

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知一个数(允许前导零)有 n 位(n 为偶数),并知道组成这个 ...

  3. AtCoder Regular Contest 058

    这个应该是第一场有英文的atcoder吧??不过题解却没有英文的... 从前往后慢慢做... C こだわり者いろはちゃん / Iroha's Obsession 数据范围这么小,直接暴力 #inclu ...

  4. loadrunner_关联检查点参数化

    1.保存变量函数 lr_save_string("192.168.xx.xx","ip"); URL=http://{ip} 2.检查点函数 web_reg_f ...

  5. 2-3-4 tree留坑

    #include<bits/stdc++.h> #define LL long long #define pii pair<int,int> #define mp make_p ...

  6. 微信授权登录-微信公众号和PC端网站

    https://blog.csdn.net/qq_34664239/article/details/79107529 一.微信公众号授权登录——微信公众平台 微信授权登录,并调用后台接口,获取用户信息 ...

  7. vue项目配置同一局域网可使用ip访问

    1.检查 package.json文件,scripts.dev设置 host改成 "0.0.0.0" 2.config文件中找到 index.js 文件的host改成 " ...

  8. win10如何关闭计算机设备和驱动器非硬盘图标

    按win键+R,打开注册表regedit,找到这个路径: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\My ...

  9. H3C 传输层

  10. SuperSocket获取所有连接上的 Session

    你也可以从 AppServer 实例获取所有连接上的 session 然后推送数据到所有客户端: foreach(var session in appServer.GetAllSessions()) ...