[Poj3133]Manhattan Wiring (插头DP)
Description
题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点。现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复经过同一格子),并且不能经过墙壁,路径只能从一个格子走到相邻的下一格子。求两条路径最少需要经过的格子数减二。如果不存在解,输出0。
Solution
插头DP,用三进制来表示轮廓线,0表示没有插头,1表示“2”的的插头,2表示“3”的插头
- 对于0的格子:00 -> 00,11,22;01/10 -> 01/10;02/20 -> 02/20;11/22 -> 00。
- 对于1的格子:00 -> 00。
- 对于2的格子:01/10 -> 00,00 -> 01/10。
- 对于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)的更多相关文章
- uva1214 Manhattan Wiring 插头DP
There is a rectangular area containing n × m cells. Two cells are marked with “2”, and another two w ...
- poj3133 Manhattan Wiring
Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2016 Accepted: 1162 ...
- POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)
题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这 ...
- 【poj3133】 Manhattan Wiring
http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不 ...
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- 「总结」插头$dp$
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...
- 初探插头dp
开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...
- [LA3620]Manhattan Wiring
[LA3620]Manhattan Wiring 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入” 题解 我们把“连线”的过程改为“铺地砖”的过程,总共有 11 种地砖,每种地砖上 ...
随机推荐
- ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】
Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (J ...
- 11个炫酷的 Linux 终端命令
我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...
- Java的HashMap和HashTable(转)
来源:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html 1. HashMap 1) hashmap的数据结构 Has ...
- sublime 常用快捷键(转)
Sublime text 3是码农最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率.刚开始可能有些生疏,只要花一两个星期坚持使用并熟悉这些常用的快捷键 ...
- redis空间键详解
前言 redis的空间键通知是在2.8.0版本以后加入的,客户端通过发布订阅的方式,订阅某个频道,接收通过某种方式影响redis中数据的事件. 目录: 1.空间键事件分类 2.如何启用redis的空间 ...
- Spring MVC + Thymeleaf
参考网址: https://www.cnblogs.com/litblank/p/7988689.html 一.简介 1.Thymeleaf 在有网络和无网络的环境下皆可运行,而且完全不需启动WEB应 ...
- 解决Android Studio和Android SDK Manager无法在线更新的问题[转]
升级时提示 Connection failed. Please check your network connection and try again 修改安装目录下bin\studio.exe.vm ...
- linux下配置Nginx,支持thinkphp
前言引入 一个刚入行的朋友,刚换工作,入职了一个新公司.新公司一个php开发,就是他.俨然老板把他当成公司扛把子了,把服务器都给了他,让他部署整个php的开发环境.那个朋友是wamp爱好者.然后面对l ...
- MySQL访问
MySQL访问 1.介绍 python访问mysql数据库,需要安装mysql的python插件. 2.安装插件 通过pip命令安装mysql插件. # cmd>pip install PyMy ...
- nginx对不存在的文件进行404处理
location / { try_files $uri $uri/ /?$args 404; } location / { try_files $uri $uri/ /index.html 404; ...