Problem Mountain

题目大意

  给定一张n*m的地图,由 . 和 X 组成。要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的点。

    n<=5 , m<=5。

解题分析

  考虑从1~n*m,从小到大依次填数,则如果某个位置编号为X且该位置还未填数,那么其周围的点均不能填数。

  令dp[i][j]表示填到第i个数,状态为j 。 令X的个数为cnt,那么 j ∈[ 0 , 1<<cnt)。

  一种情况为第i个数填在 X 的位置上,那么dp[i][j] 可以由 dp[i-1][j-{x}] 转移过来。 j - {x} 表示去掉某个X后的状态。

  另一种情况为第i个数填在 . 的位置,那么首先预处理一下w[j]表示状态为j时有多少个位置是可以填的,那么dp[i]][j] += dp[i-1][j] * (w[j] - (i-1))

  又因为要保证遍号为.的点至少大于一个其周围的点,dfs容斥一下。

参考程序

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std; #define N 100008
#define M 50008
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define clr(x,v) memset(x,v,sizeof(x));
#define rep(x,y,z) for (int x=y;x<=z;x++)
#define repd(x,y,z) for (int x=y;x>=z;x--)
const int mo = ;
const int inf = 0x3f3f3f3f;
const int INF = ;
/**************************************************************************/
int n,m,ans,dp[][],w[],tx[],ty[];
char mp[][];
int flag[][];
const int dx[]={-,-,-,,,,,,};
const int dy[]={-,,,-,,,-,,};
void up(int &x,int y){
x = (x + y) % mo;
if (x>=mo) x-=mo;
}
int solve(){
int cnt=;
rep(i,,n) rep(j,,m)
if (mp[i][j]=='X'){
tx[++cnt]=i;
ty[cnt]=j;
}
for (int i=;i<<<cnt;i++){
clr(flag,);
for (int j=;j<=cnt;j++)
if (i & <<j-)
for (int k=;k<;k++) flag[tx[j]+dx[k]][ty[j]+dy[k]]=;
w[i]=;
rep(j,,n) rep(k,,m)
if (!flag[j][k]) w[i]++;
}
clr(dp,);
dp[][]=;
for (int i=;i<=n*m;i++)
for (int j=;j<<<cnt;j++)
{
for (int k=;k<=cnt;k++)
if (j & <<k-)
up(dp[i][j],dp[i-][j - (<<k-)]);
up(dp[i][j],dp[i-][j]*(w[j]-i+));
}
return dp[n*m][(<<cnt)-];
}
void dfs(int x,int y,int p){
if (y==m+){
x++;
y=;
}
if (x==n+){
ans=(ans + solve()*p) % mo;
if (ans<) ans+=mo;
return;
}
int flag=;
for (int i=;i<;i++) if (i!=&&mp[x+dx[i]][y+dy[i]]=='X') flag=;
if (mp[x][y]=='X')
if (flag) return; else dfs(x,y+,p);
else
{
dfs(x,y+,p);
if (!flag)
{
mp[x][y]='X';
dfs(x,y+,-p);
mp[x][y]='.';
}
}
}
int main(){
int cas=;
while (~scanf("%d %d",&n,&m)){
clr(mp,); ans=;
rep(i,,n) scanf("%s",mp[i]+);
dfs(,,);
printf("Case #%d: %d\n",++cas,ans);
}
}

HDU 5838 (状压DP+容斥)的更多相关文章

  1. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  2. bzoj2669 [cqoi2012]局部极小值 状压DP+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...

  3. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  4. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  5. [清华集训2015 Day1]主旋律-[状压dp+容斥]

    Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...

  6. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  7. uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

    传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...

  8. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  9. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

随机推荐

  1. document.compatMode属性和获取鼠标的位置

    document.compatMode属性 document.compatMode用来判断当前浏览器采用的渲染方式. 官方解释: BackCompat:标准兼容模式关闭.CSS1Compat:标准兼容 ...

  2. 探究chrome下的开发工具的各功能

    F12 一.网页寻找js事件的位置,或者某一个次究竟在哪个相关的文件中可以全局搜索: ①控制台右上角的:(Customize and control DevTools)三个点点开,---->Se ...

  3. dll文件是什么

    dll实际上是动态链接库的缩写,从windows1.0开始,动态链接库就是整个操作系统的基础,那么这有什么作用呢?在dos时代,程序员是通过编写程序来达到预期的目的的,每实现一个目的就需要编写一个程序 ...

  4. text-overflow:ellipsis

    关键字: text-overflow:ellipsis 语法:text-overflow : clip | ellipsis 取值: clip :默认值 .不显示省略标记(...),而是简单的裁切. ...

  5. linux笔记:shell基础-环境变量配置文件

    source命令(重新读入配置文件,不用重启就直接生效): 环境变量配置文件: linux中的环境变量配置文件(~代表当前用户的家目录): 配置文件读取顺序: /etc/profile 文件的作用:

  6. Java 前后端分离研究

    https://github.com/ulyn/eos https://github.com/lenbo-ma/jfinal-api-scaffold/

  7. shell的if判断

     shell的if判断 2012-03-16 14:53:05 分类: Python/Ruby   1 概要 有时候你需要指定shell脚本中的依靠命令的成功与否来实施不同过程的行为. if 结构允许 ...

  8. 习题-第1章了解ASP.NET MVC

    一.选择题 1.ASP.NET MVC自2007年首次公布预览以来,作为(    )的替代品,普及度已明显提高,现在很多大型Web应用程序都是使用这一技术构建的. A.ASP    B.ASP.NET ...

  9. 华为WLAN产品介绍-05

    无线AP与AC的区别 WLAN系统一般由AC(接入控制器)和AP(无线接入点)组成. 无线AP,为Access Point简称,一般翻译为“无线访问节点”,它是用于无线网络的无线交换机,也是无线网络的 ...

  10. mongodb unclean shutdown 修复方法

    启动mongodb时,提示Unclean shutdown detected mongodb,解决方法很简单 mongod --repair --dbpath D:\MongoDB\data\db