Description

题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点。现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复经过同一格子),并且不能经过墙壁,路径只能从一个格子走到相邻的下一格子。求两条路径最少需要经过的格子数减二。如果不存在解,输出0。

Solution

插头DP,用三进制来表示轮廓线,0表示没有插头,1表示“2”的的插头,2表示“3”的插头

  1. 对于0的格子:00 -> 00,11,22;01/10 -> 01/10;02/20 -> 02/20;11/22 -> 00。
  2. 对于1的格子:00 -> 00。
  3. 对于2的格子:01/10 -> 00,00 -> 01/10。
  4. 对于3的格子:02/20 -> 00,00 -> 02/20。

但是if太多会超时,所以有必要减少if语句的使用

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 11
using namespace std; const int A[]={1,3,9,27,81,243,729,2187,6561,19683,59049};
int n,m,g[N][N],dp[N][N][59049]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} int main(){
while(~scanf("%d%d",&n,&m)&&n+m){
memset(g,0,sizeof(g));
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)g[i][j]=read(); dp[0][m][0]=0;
for(int i=1;i<=n;++i){
for(int j=0;j<A[m];++j)//A[m]
dp[i][0][j*3]=dp[i-1][m][j];
for(int j=1;j<=m;++j){
for(int k=0;k<A[m+1];++k){//A[m+1]
if (j==m&&k>=A[m]) break;
int a=(k/A[j-1])%3,b=(k/A[j])%3;
if(g[i][j]==1){
if(a==0&&b==0) dp[i][j][k]=dp[i][j-1][k];
}else if(g[i][j]==2){//min,+1
if(a==1&&b==0) dp[i][j][k]=dp[i][j-1][k-A[j-1]]+1;
else if(a==0&&b==1) dp[i][j][k]=dp[i][j-1][k-A[j]]+1;
else if(a==0&&b==0) dp[i][j][k]=min(dp[i][j-1][k+A[j-1]],dp[i][j-1][k+A[j]])+1;
}else if(g[i][j]==3){
if(a==2&&b==0) dp[i][j][k]=dp[i][j-1][k-2*A[j-1]]+1;
else if(a==0&&b==2) dp[i][j][k]=dp[i][j-1][k-2*A[j]]+1;
else if(a==0&&b==0) dp[i][j][k]=min(dp[i][j-1][k+2*A[j-1]],dp[i][j-1][k+2*A[j]])+1;
}
else if(g[i][j]==0){
if(a==0&&b==0) dp[i][j][k]=min(dp[i][j-1][k],min(dp[i][j-1][k+A[j]+A[j-1]]+1,dp[i][j-1][k+2*A[j]+2*A[j-1]]+1));
else if(a==0&&b>0) dp[i][j][k]=min(dp[i][j-1][k],dp[i][j-1][k+b*A[j-1]-b*A[j]])+1;
else if(a>0&&b==0) dp[i][j][k]=min(dp[i][j-1][k],dp[i][j-1][k+a*A[j]-a*A[j-1]])+1;
else if(a&&b&&a==b) dp[i][j][k]=dp[i][j-1][k-a*A[j]-a*A[j-1]]+1;
}
if (i==n&&j==m) break;
}
}
}
if(dp[n][m][0]<0x3f3f3f3f) printf("%d\n",dp[n][m][0]-2);
else printf("0\n");
}
return 0;
}

[Poj3133]Manhattan Wiring (插头DP)的更多相关文章

  1. uva1214 Manhattan Wiring 插头DP

    There is a rectangular area containing n × m cells. Two cells are marked with “2”, and another two w ...

  2. poj3133 Manhattan Wiring

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2016   Accepted: 1162 ...

  3. POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)

    题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这 ...

  4. 【poj3133】 Manhattan Wiring

    http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不 ...

  5. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  6. 「总结」插头$dp$

    集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...

  7. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  8. 初探插头dp

    开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...

  9. [LA3620]Manhattan Wiring

    [LA3620]Manhattan Wiring 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入” 题解 我们把“连线”的过程改为“铺地砖”的过程,总共有 11 种地砖,每种地砖上 ...

随机推荐

  1. C# 几种数据类型转换方式

    1.(int)变量名[强制类型转换] 该转换方式主要用于数字类型之间的转换,从int类型向long,float,double,decimal 类型转换可以使用隐式转换,但从long型到int 就需要使 ...

  2. java注解相关

    本文参考很多大神的文档,特别再次表示感谢分享!! 1.何为注解?  概念:注解(Annotation),也叫元数据.一种代码级别的说明. 它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在 ...

  3. C#实现对EXCEL指定单元格进行操作

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Ex ...

  4. eclipse加上电脑全黑主题的设置(win10)

    eclipse加上电脑全黑主题的设置(win10) 前几天在找设置win10的边框颜色时,发现的这个高对比的功能,现在已经用了好几天了,自己感觉是真的好用,所有才分享出来,相比所谓网上的豆沙绿,果然感 ...

  5. VMware ESXi5忘记登录密码解决办法

    很久没有登录ESXi5了,今天登录发现忘记密码了: 网上搜索到的方法都是使用linux其他版本的镜像的恢复模式来重置密码(尝试过了,ESXI自己的镜像没有恢复模式).于是使用现有的Ubuntu镜像来操 ...

  6. WPF动画的几种模式

    最近在用WPF做简单动画,以下是几点经验总结: 1. 使用DispatcherTimer做动画 VB6的年代大家就用Timer做动画了,不用多解释,这个DispatcherTimer和本身的Timer ...

  7. 从零开始的全栈工程师——js篇2.7(JS数据类型具体分析)

    JS数据类型具体分析与数据的三大存储格式 1. 字符串 string2. 数字 number3. 布尔 boolean4. null 空5. undefined 未定义↑↑↑叫基本数据类型 基本数据类 ...

  8. 从零开始的全栈工程师——js篇2.2

    条件语句 补充: var a=“hello world” a这个变量是字符串了 对于里面每一个字母来说 他是字节 里面有11个字节 字节总数用length表示 如下: 根据上面的内容咱们又发现了一个运 ...

  9. 创建一个自己的GitHub,创建自己的开源项目

    作者是一个大学在读学生,自己在平时的学习中,GitHub上的开源项目给自己提供了很大的帮助.GitHub是目前使用最广泛的分布式项目管理软件,GitHub上面托管了许多非常优秀的开源项目.我觉得每一个 ...

  10. hiho一下 第三十八周 二分答案

    题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...