hihocoder #1608 : Jerry的奶酪(状压dp)
题目链接:http://hihocoder.com/problemset/problem/1608
题解:就是一道简单的状压dp由于dfs过程中只需要几个点之间的转移所以只要预处理一下几个点就行。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int dp[ << ];
int to[][] , dr[][] = { , , - , , , , , -};
char mmp[][];
int n , m , k;
struct TnT {
int x , y , step;
}point[];
bool vis[][];
int bfs(TnT sta , TnT ed) {
queue<TnT>q;
memset(vis , false , sizeof(vis));
sta.step = ;
q.push(sta);
vis[sta.x][sta.y] = true;
while(!q.empty()) {
TnT gg = q.front();
q.pop();
if(gg.x == ed.x && gg.y == ed.y) return gg.step;
for(int i = ; i < ; i++) {
TnT gl = gg;
gl.x += dr[i][];
gl.y += dr[i][];
gl.step++;
if(gl.x >= && gl.x < n && gl.y >= && gl.y < m && mmp[gl.x][gl.y] != '' && !vis[gl.x][gl.y]) {
vis[gl.x][gl.y] = true;
q.push(gl);
}
}
}
return -;
}
int ans;
void dfs(int state , int numb , int step) {
if(state == -) return ;
TnT sta , ed;
sta = point[numb];
if(state == ( << k) - ) {
ed = point[k + ];
if(to[numb][k + ] == -) return ;
if(ans == -) {
ans = step + to[numb][k + ];
}
else ans = min(ans , step + to[numb][k + ]);
return ;
}
for(int i = ; i < k ; i++) {
int g = ( << i);
if(state & g) continue;
TnT ed = point[i];
int step_next = step;
int gg = to[numb][i];
if(gg == -) return ;
step_next += gg;
dfs(state | g , i , step_next);
}
}
int main() {
scanf("%d%d%d" , &n , &m , &k);
for(int i = ; i < n ; i++) {
scanf("%s" , mmp[i]);
}
int sta = ;
memset(to , , sizeof(to));
for(int i = ; i < k ; i++) {
scanf("%d%d" , &point[i].x , &point[i].y);
if(mmp[point[i].x][point[i].y] == '') sta = -;
}
point[k].x = , point[k].y = ;
point[k + ].x = n - , point[k + ].y = m - ;
for(int i = ; i <= k + ; i++) {
for(int j = ; j <= k + ; j++) {
if(i == j) continue;
TnT sta , ed;
sta.x = point[i].x , sta.y = point[i].y;
ed.x = point[j].x , ed.y = point[j].y;
to[i][j] = bfs(sta , ed);
to[j][i] = to[i][j];
}
}
if(mmp[n - ][m - ] == '') sta = -;
ans = -;
dfs(sta , k , );
printf("%d\n" , ans);
return ;
}
hihocoder #1608 : Jerry的奶酪(状压dp)的更多相关文章
- hihocoder #1608 : Jerry的奶酪(状压DP)
传送门 题意 分析 设dp[i][j]为在i状态下当前在第j个奶酪的最小费用 转移方程:dp[(1<<k)|i][k]=dp[i][j]+d[j][k] 预处理出每个奶酪之间的距离,加入起 ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- hihocoder #1044 : 状态压缩·一 状压DP
http://hihocoder.com/problemset/problem/1044 可以看出来每一位的选取只与前m位有关,我们把每个位置起始的前m位选取状态看出01序列,就可以作为一个数字来存储 ...
- 吃奶酪 状压dp
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
- hihoCoder 1044 : 状态压缩·一 状压dp
思路:状态压缩,dp(i, j)表示考虑前i个数且[i-m+1, i]的选择情况为j.如果要选择当前这个数并且,数位1的个数不超过q,则dp[i+1][nex] = max(dp[i+1][nex], ...
- P1433 吃奶酪(洛谷)状压dp解法
嗯?这题竟然是个绿题. 这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的状压dp就可以了. 是的状压dp. 这个题的数据加 ...
- [状压DP]吃奶酪
吃 奶 酪 吃奶酪 吃奶酪 题目描述 房间里放着 n n n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 ( 0 , 0 ) (0,0) (0,0)点处. 输入 第一行有一个整 ...
- HihoCoder - 1794:拼三角形 (状压DP)
描述 给定 n 根木棍,第 i 根长度为 ai 现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断 请你求出最多能拼出几个 输入 第一行一个正整数 n 第二行 n ...
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
随机推荐
- 模拟器无Back、Menu等键
问题如图所示: 解决方法: 1. 打开Android Virtual Device (AVD) Manager --> 选择模拟器,并点击edit --> 勾选KeyBoard中的选项,并 ...
- ansible-service
#service#查询服务状态 ansible server01 -m service -a "name=httpd state=started" #停止服务 ansible se ...
- java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解
这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...
- mybatis 源码分析(一)框架结构概览
本篇博客将主要对 mybatis 整体介绍,包括 mybatis 的项目结构,执行的主要流程,初始化流程,API 等各模块进行简单的串联,让你能够对 mybatis 有一个整体的把握.另外在 myba ...
- 浅谈 JavaScript 垃圾回收机制
github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...
- 弃用 wget, 拥抱多线程下载 axel
0x00 事件 对于在 Linux 的下载工具而言,比较常用的就是 wget 或者 curl,吾也一直用 wget 的方式进行网络上的资源下载.偶然发现了 axel 这个支持多线程的下载工具,试用了几 ...
- jupyter iPython web sit use 1
I want Jupyter to print all the interactive output without resorting to print, not only the last res ...
- [Spring cloud 一步步实现广告系统] 21. 系统错误汇总
广告系统学习过程中问题答疑 博客园 Eureka集群启动报错 Answer 因为Eureka在集群启动过程中,会连接集群中其他的机器进行数据同步,在这个过程中,如果别的服务还没有启动完成,就会出现Co ...
- Docker系列之.NET Core入门(三)
前言 在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker. 专业术语 Docker Engine(Do ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...