#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int INF=;
int nrows,ncols;
int G[][];
struct State
{
int up[];
int left;
int encode()const
{
int key=left;
for(int i=; i<ncols; i++)
key=key*+up[i];
return key;
}
bool next(int row, int col, int U, int D, int L, int R, State &T)const
{
if( row==nrows- && D != ) return false; //最下行不能有向下的插头
if( col==ncols- && R != ) return false; //最右列右边不能有插头
int must_left=(col>&&left!=);// 是否必须要左插头
int must_up =(row>&&up[col]!=);//是否必须要右插头
if((must_left!= && L!=left ) || (must_left== && L!= )) return false;//左插头不匹配
if((must_up != && U!=up[col])||(must_up== && U!= ) ) return false;//上插头不匹配
if(must_left && must_up && left!=up[col]) return false; for(int i=; i<ncols; i++)T.up[i]=up[i];
T.up[col]=D;
T.left=R;
return true;
}
};
int memo[][][];
int rec(int row, int col, const State &S)
{
if(col==ncols){ col=; row++;};
if(row==nrows)return ;
int key=S.encode();
int &res = memo[row][col][key];
if(res>=)return res;
res=INF;
State T;
if(G[row][col]<=)
{
if(S.next(row,col,,,,,T))res=min(res,rec(row,col+,T));
if(G[row][col]== )
for(int t=; t<= ; t++)
{
if(S.next(row,col,t,t,,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,t,,t,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,t,,,t,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,t,t,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,t,,t,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,,t,t,T))res=min(res,rec(row,col+,T)+);
} }
else {
int t=G[row][col]-;
if(S.next(row,col,t,,,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,t,,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,,t,,T))res=min(res,rec(row,col+,T)+);
if(S.next(row,col,,,,t,T))res=min(res,rec(row,col+,T)+);
}
return res;
}
int main()
{
while(scanf("%d%d",&nrows,&ncols)==&&nrows&&ncols)
{
for(int i=; i<nrows; i++)
for(int j=; j<ncols; j++)
scanf("%d",&G[i][j]);
State S;
memset(&S,,sizeof(S));
memset(memo,-,sizeof(memo));
int ans=rec(,,S);
if(ans==INF)ans=;
printf("%d\n",ans/);
}
return ;
}

poj3133 插头dp的更多相关文章

  1. [Poj3133]Manhattan Wiring (插头DP)

    Description 题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点.现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复 ...

  2. 初探插头dp

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

  3. 插头dp

    插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...

  4. HDU 4113 Construct the Great Wall(插头dp)

    好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...

  5. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  6. 插头DP专题

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

  7. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

  8. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

  9. HDU 4064 Carcassonne(插头DP)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4064 Problem Description Carcassonne is a tile-based ...

随机推荐

  1. tensorflow中moving average的用法

    一般在保存模型参数的时候,都会保存一份moving average,是取了不同迭代次数模型的移动平均,移动平均后的模型往往在性能上会比最后一次迭代保存的模型要好一些. tensorflow-model ...

  2. 【GIS】无人机相关技术(转)

    ---------------------------------------------------------------------------------------------------G ...

  3. k8s(5)-拓展服务

    在之前我们创建了一个部署,然后通过服务公开它.部署只创建了一个Pod来运行我们的应用程序.当流量增加时,我们需要扩展应用程序以满足用户需求. 通过更改部署中的副本数来完成扩展. 1. 拓展部署 这里将 ...

  4. LeetCode - 804. Unique Morse Code Words

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  5. JDBC driver for MySQL连接提示"The connection property 'zeroDateTimeBehavior' acceptable values are: 'CONVERT_TO_NULL', 'EXCEPTION' or 'ROUND'. The value 'convertToNull' is not acceptable."解决方案

    1.使用了8.0以上版本的JDBC driver for MySQL,降回5.x版本. 2.不对JDBC driver for MySQL降级.修改数据库连接字符串,添加serverTimezone属 ...

  6. [Sublime] Sublime Text 3126 lincense

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E- 8A353C41 872A0D5C DF9B2950 AFF6F667 C45 ...

  7. asp.net mvc 通过StyleBundle添加样式后,没有作用

    在App_Start/BundleConfig配置 导入bootstrap,但不起作用,代码如下: bundles.Add(new StyleBundle("~/Content/bootst ...

  8. git纯净提交代码(只提交自己改过的文件)

    添加远程仓库,这个远程仓库是要进行发起合并请求的仓库,简单来说就是项目的主要代码库,不是自己派生的代码库 git remote add main http://xxx  从远端仓库下载新分支与数据gi ...

  9. dll注入遇到CreateRemoteThread()返回错误代码5

    在进行dll注入的时候,发现触发了CreateRemoteThread()的错误并返回错误代码5,刚开始以为权限不够,用了管理员权限和加了SetPrivilege()函数提权和用NtCreateThr ...

  10. 支持多文件上传,预览,拖拽,基于bootstrap的上传插件fileinput 的ajax异步上传(转载)

    首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"&g ...