Description

给定一个R*C大小的迷宫,其中R,C均为奇数 迷宫中坐标为两个奇数的点不能通过,称为障碍,迷宫中其他不能通过的点统称为墙壁 坐标为两个偶数的点可以通过,称为房间,迷宫中其他可通过的点称为走廊。迷宫有边界 迷宫中放置有若干个物品(偶数个),物品一定放置在房间中 问如何将这些物品配对可以使得所有物品对之间路径的总和最小,任两条路径不能相交,并求路径

Input

第一行输入为两个整数: R与C(5 ≤ R ≤ 25,5 ≤ C ≤ 80) 其中R为行数,C为列数,R,C均为奇数。 接下来的R行每行包括C个字符,每个字符都是’+’、’|’、’-‘、空格或’X’中的一个,分别表示障碍及两种墙壁、空格表示房间或可通过的走廊,X表示房间中的物品。

Output

输出的第一行是一个整数,即最小分值。
  1. /*
  2. 插头DP
  3. 这道题看了一晚上了,还是有很多地方不理解,Orz~
  4. */
  5. #include<cstdio>
  6. #include<iostream>
  7. #include<cstring>
  8. using namespace std;
  9. int n,m,inf,cnt;
  10. int f[][][(<<)+],blo[][][];
  11. char s1[][],s[][];
  12. int dx[]={,-,,};
  13. int dy[]={-,,,};
  14. void upd(int &x,int y){x=min(x,y);}
  15. int trs(int x,int y){
  16. x=(x>>)<<;x|=y&;
  17. x|=((y&)>>)<<m;
  18. return x;
  19. }
  20. int main(){
  21. scanf("%d%d",&n,&m);gets(s1[]+);
  22. for(int i=;i<=n;i++) gets(s1[i]+);
  23. for(int i=;i<=n;i++)
  24. for(int j=;j<=m;j++)
  25. s[j][i]=s1[i][j],cnt+=(s1[i][j]=='X');
  26. swap(n,m);
  27. for(int i=;i<n;i+=)
  28. for(int j=;j<m;j+=)
  29. for(int k=;k<;k++)
  30. blo[i>>][j>>][k]=(s[i+dy[k]][j+dx[k]]!=' ');
  31. n/=;m/=;
  32. memset(f[],0x3f,sizeof(f[]));
  33. inf=f[][][];f[][][]=;
  34. for(int i=;i<=n;i++)
  35. for(int j=;j<=m;j++){
  36. if(j==m)
  37. memset(f[~i&],0x3f,sizeof(f[~i&]));
  38. for(int k=;k<<<m+;k++){
  39. if(f[i&][j][k]==inf) continue;
  40. int *nex;
  41. if(j==m) nex=f[~i&][];
  42. else nex=f[i&][j+];
  43. int v1=blo[i][j][],v2=blo[i][j][],val=f[i&][j][k];
  44. if(s[i<<][j<<]=='X'){
  45. if((k&)==) continue;
  46. if((k&)==){
  47. if(!v2) upd(nex[trs(k,)],val+);
  48. if(!v1) upd(nex[trs(k,)],val+);
  49. }
  50. else upd(nex[trs(k,)],val);
  51. }
  52. else{
  53. if((k&)==) upd(nex[trs(k,)],val+);
  54. else if((k&)==){
  55. upd(nex[trs(k,)],val);
  56. if(!v1&&!v2) upd(nex[trs(k,)],val+);
  57. }
  58. else {
  59. if(!v2) upd(nex[trs(k,)],val+);
  60. if(!v1) upd(nex[trs(k,)],val+);
  61. }
  62. }
  63. }
  64. }
  65. printf("%d\n",f[(n+)&][][]+cnt/);
  66. return ;
  67. }

Connect(bzoj 1948)的更多相关文章

  1. BZOJ 1614 USACO 07Jan. 洛谷1948 电话线

    二分+特殊姿势的check:二分最小代价P,把边权小于等于P的边设为0,其他的设为1,跑一遍最短路,判断dis[n]是否大于K #include<cstdio> #include<a ...

  2. 【BZOJ】【2049】【SDOI2008】洞穴勘测 Cave

    LCT 哦……LCT的一道更水的裸题,适合学习access,link,cut等基本操作(其实这三个不是在一个层面上的?不要在意这些细节……) /**************************** ...

  3. BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习

    #include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar(); ...

  4. 【BZOJ】2049: [Sdoi2008]Cave 洞穴勘测(lct/并查集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2049 bzoj挂了..在wikioi提交,,1A-写lct的速度越来越快了-都不用debug-- 新 ...

  5. 【BZOJ】【4034】【HAOI2015】T2

    树链剖分/dfs序 树上单点修改+子树修改+链查询 其实用dfs序做也可以…… 其实树链剖分就是一个特殊的dfs序嘛= =所以树链剖分也可以搞子树-(Orz ZYF) 至于为什么……你看在做剖分的时候 ...

  6. 【BZOJ】【1036】树的统计

    嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...

  7. 【BZOJ】【2588】COT(Count On a Tree)

    可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 19 ...

  8. 【BZOJ】【2819】NIM

    这题……咋说捏,其实是一道披着博弈论外衣的树上操作问题…… 随便用dfs序或者树链剖分转成序列,然后查询路径上的所有点的NIM和(异或和)就行了,毕竟除了是在树上以外,就是裸的NIM问题. 树链剖分: ...

  9. BZOJ 3563 DZY Loves Chinese

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

随机推荐

  1. Java发出声卡蜂鸣生的方法

    方法一: Toolkit.getDefaultToolkit().beep(); 方法二: System.out.println('\007');//八进制数

  2. JSP出现"属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义"的解决方法

    写JSP时出现属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义. 源代码: <jsp:setPrope ...

  3. abs的个人博客 http://abs001.top/blog

    abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 abs的个人博客 a ...

  4. mysql--连接查询(内外连接)

    连接查询又称多表查询,查询到的字段来自于多个表中的数据. 一. 连接查询的分类和语法 1.分类 按标准分: 92标准:只支持内连接 99标准:支持内连接和.外连接和全外连接 功能进行分类: 内连接:i ...

  5. 神经网络系列学习笔记(二)——神经网络之DNN学习笔记

    一.单层感知机(perceptron) 拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换到达输出层,在输出层得到分类结果: 缺点:无法模拟稍复杂一些的函数(例如简单的异或计算). 解决办法 ...

  6. 前段ztree 树状插件

    效果展示

  7. Spark架构与作业执行流程简介(scala版)

    在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此: 字面意思就是弹性分布式数据集,是spark中最基本的数 ...

  8. 传送流(TS)的基础知识

    数字电视的TS包和TS流的组成和功能 综合考虑几下几个因素: (1)包的长度不能过短,否则包头开销所占比例过大, 导致传输效率下降 (2)包的长度不能过长,否则在丢失同步的情况下恢复同步的 周期过长, ...

  9. HDU:2222-Keywords Search(AC自动机模板,匹配模拟)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...

  10. Mysql密码加密方式

    以Mysql 4.1版本为分界线,两种加密方式 Mysql323加密:(16位) select  old_password('root'); //Mysql自带加密函数old_password(str ...