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 ...
随机推荐
- 【eclipse】No enclosing instance of type A is accessible. Must qualify the allocation with an enclosing instance of type A
用 eclipse 写 Java 代码时出现了这个问题,详细如下: No enclosing instance of type TestParsingLinkedList is accessible. ...
- 【iOS】The identity used sign the executable is no longer valid.
之前就遇到过这个问题,如图: 今天又遇到了,证书过期的问题. 需要访问苹果开发者的官网 http://developer.apple.com 来解决. 参考:How to fix “The ident ...
- superset安装文档
1 安装python3.6 yum install epel-release -y yum install https://centos7.iuscommunity.org/ius-release.r ...
- linux下mysql无法看到3306端口监听
这个问题搞定了,原因是我的my.cnf有话:skip-network注释掉,然后运行netstat -an|grep 3306 就可以看到了
- 深入理解JVM-java字节码文件结构剖析(练习解读字节码)
public class MyTest2 { String str = "Welcome"; private int x = 5; public static Integer in ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
- Mybatis学习笔记之---环境搭建与入门
Mybatis环境搭建与入门 (一)环境搭建 (1)第一步:创建maven工程并导入jar包 <dependencies> <dependency> <groupId&g ...
- java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态
刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...
- Spring 集成Kafka(完整版)
前面的文章我们已经完成了Kafka基于Zookeeper的集群的搭建了.Kafka集群搭建请点我.记过几天的研究已经实现Spring的集成了.本文重点 jar包准备 集成是基于spring-integ ...
- JSP前端数据本地排序
在前端中我们经常需要数据的排序,首先写引入我写好的js $(function($) { $('#sclazzId').val($('#voId').val()); document.getElemen ...