poj3133 插头dp
#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的更多相关文章
- [Poj3133]Manhattan Wiring (插头DP)
Description 题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点.现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复 ...
- 初探插头dp
开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...
- 插头dp
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...
- HDU 4113 Construct the Great Wall(插头dp)
好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
- 插头DP专题
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...
- HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)
插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...
- HDU 1693 Eat the Trees(插头DP)
题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...
- 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 ...
随机推荐
- Linux 文件特殊权限_013
***Linux 系统文件除了9位基本权限,还有额外3位特殊权限,分别是SUID(setuid),SGID(setgid),SBIT(sticky bit) 一.Linux 系统文件3位特殊权限位说明 ...
- 和TransDecoder 学习perl 自定义模块的路径问题
TransDecoder 软件是用perl 原因写的,其中包含了一些自定义的模块,通过一个脚本来进行调用,为了能够正常访问自定义的perl 模块, 在其源代码中利用了FindBin 这个模块 use ...
- open-falcon实现邮件报警
1.请安装好Go的环境,参考上一篇open-falcon的安装博文 2.安装 mail-provider https://github.com/open-falcon/mail-provider 安装 ...
- C#中 Excel和其他文件类型的Content-Type/mime-type
C#中 Excel和其他文件类型的Content-Type/mime-type For BIFF .xls files application/vnd.ms-excel For Excel2007 a ...
- unix下ksh获取昨天的日期
http://blog.chinaunix.net/uid-27795718-id-3347473.html 总结:使用了TZ以后,时间立刻变伦敦时间.如果你打算用"TZ=aaa24 dat ...
- 【netcore基础】ConcurrentDictionary 使用字符串作为key给代码加锁且使用EF事物防止并发调用数据混乱的问题
业务场景需要锁住指定的字符串下的代码,防止并发创建多个订单 这里我们使用 ConcurrentDictionary 首先初始化一个字典 private static readonly Concurre ...
- python 中的 list dict 与 set 的关系
转自: http://www.cnblogs.com/soaringEveryday/p/5044007.html list arraylist 实现(数组) List 通过内置的 append()方 ...
- CEditUI 控件使用
SetLimitText(UINT nMax ) //设置文本限制字符数 参数为nMax为控件可接受的文本最大字节数 GetTextLength() //获得文本长度 参考文档:http://www ...
- padding 和 float属性
padding = {上内,右内,下内,左内} 内边距 padding:"10, 5,15,20" float = "true" 控件固定住.
- 地图标绘系统V1.0测试版【申明:来源于网络】
地图标绘系统V1.0测试版[申明:来源于网络] 地址:http://blog.csdn.net/allgis/article/details/39718085