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 文件删除原理_009
***了解Linux文件删除原理先了解一下文件inode索引节点,每个文件在Linux系统里都有唯一的索引节点(身份证号) inode.如果文件存在硬链接,那这个文件和这个文件的硬链接的inode是相 ...
- windows pm2 启动nodejs失败:Error: EBADF: bad file descriptor, uv_pipe_open
windows下打开命令窗口,安装pm2:npm install pm2 -g pm2成功安装,在项目目录下用pm2启动服务:pm2 start index.js,结果启动失败,错误如下: .pm2\ ...
- 125、Android样式的开发(转载)
Android样式的开发:drawable汇总篇 http://android.jobbole.com/82117/Android样式的开发:layer-list篇 http://android.jo ...
- oracle 28000错误解决方法
ORA-28000: the account is locked-的解决办法 ORA-28000: the account is locked 第一步:使用PL/SQL,登录名为system,数据库名 ...
- layui封装自定义模块
转自:https://lianghongbo.cn/blog/430585105a35948c layui是国人开发的一款非常简洁的UI框架,使用了模块化加载方式,因此在使用过程中我们难免需要添加自己 ...
- input 设置 width:100% 和padding后宽度超出父节点
input 设置 width:100% 和padding后宽度超出父节点 添加如下css即可: box-sizing: border-box; -webkit-box-sizing: border-b ...
- eclipse中的快捷键的使用
- kubernetes组成
kubernetes组成 k8s主要包括: kubectl 客户端命令行工具: 将接收的命令,发送给kube-apiserver,作为对整个平台操作的入口. kube-apiserver REST A ...
- 数据库查询的数据导出到xls表,集合数据导出到xls表
//实体类package com.outxls; public class Student { private Integer studentId; private String studentNam ...
- python开发 *进程数据隔离.守护进程,进程同步工具 * 180725
进程数据隔离.守护进程,进程同步工具 一.进程之间的数据隔离: from multiprocessing import Process n=100 #主程序中变量n= def func(): glob ...