HDU 5067 Harry And Dig Machine

思路:因为点才10个,在加上一个起点,处理出每一个点之间的曼哈顿距离,然后用状压dp搞,状态表示为:

dp[i][s],表示在i位置。走过的点集合为s的最小代价

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; const int N = 15;
int n, m; struct Point {
int x, y;
Point() {}
Point(int x, int y) {
this->x = x;
this->y = y;
}
} p[N]; int pn; int g[N][N];
int dp[N][(1<<13) + 5]; int dis(Point a, Point b) {
return abs(a.x - b.x) + abs(a.y - b.y);
} const int INF = 0x3f3f3f3f;
int main() {
while (~scanf("%d%d", &n, &m)) {
pn = 0;
int a;
int flag = 0;
int zero;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &a);
if (a) {
p[pn++] = Point(i, j);
if (i == 0 && j == 0) {
flag = 1;
zero = pn - 1;
}
}
}
}
if (!flag) {
zero = pn;
p[pn++] = Point(0, 0);
}
for (int i = 0; i < pn; i++) {
for (int j = i; j < pn; j++) {
g[i][j] = g[j][i] = dis(p[i], p[j]);
}
}
for (int i = 0; i < pn; i++)
for (int j = 0; j < (1<<pn); j++)
dp[i][j] = INF; dp[zero][0] = 0;
dp[zero][(1<<zero)] = 0;
int ss = (1<<pn);
for (int i = 0; i < ss; i++) {
for (int j = 0; j < pn; j++) {
if (i&(1<<j)) {
for (int k = 0; k < pn; k++) {
if (i&(1<<k)) {
dp[j][i] = min(dp[j][i], dp[k][i^(1<<j)] + g[j][k]);
}
}
}
}
}
int ans = INF;
for (int i = 0; i < pn; i++)
ans = min(ans, dp[i][(1<<pn) - 1] + g[zero][i]);
printf("%d\n", ans);
}
return 0;
}

HDU 5067 Harry And Dig Machine(状压dp)的更多相关文章

  1. HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

    题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...

  2. hdu 5067 Harry And Dig Machine (状态压缩dp)

    题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...

  3. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  4. HDU 1074:Doing Homework(状压DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Problem Description Ignatius has just ...

  5. hdu 2167 方格取数 【状压dp】(经典)

    <题目链接> 题目大意: 给出一些数字组成的n*n阶矩阵,这些数字都在[10,99]内,并且这个矩阵的  3<=n<=15,从这个矩阵中随机取出一些数字,在取完某个数字后,该数 ...

  6. HDU 6149 Valley Numer II(状压DP)

    题目链接 HDU6149 百度之星复赛的题目……比赛的时候并没有做出来. 由于低点只有15个,所以我们可以考虑状压DP. 利用01背包的思想,依次考虑每个低点,然后枚举每个状态. 在每个状态里面任意枚 ...

  7. HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

    题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空 ...

  8. HDU 2809 God of War (状压DP)

    God of War Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 4026 Unlock the Cell Phone 状压dp(类似TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4026 Unlock the Cell Phone Time Limit: 6000/3000 MS ...

随机推荐

  1. STL中unique的使用

    作用 unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲) 定义在头文件<algorithm>中 函数原型 1.只有两个参数,且参数类型都是迭代器: iter ...

  2. python day one

    今日内容: python基础: 一 编程语言 什么是编程语言? 上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人 ...

  3. ubuntu12.04 配置apache+modwsgi+django1.5

    1.首先下载modwsgi  链接如下: http://files.cnblogs.com/baoyiluo/mod_wsgi-3.4.zip 2.解压并安装mod_wsgi: ./configure ...

  4. 服务器中打开IIS管理器

    1.选远程连接服务器,然后开始>控制面板>打开或关闭Windows功能>服务器管理器>web服务器>internet信息服务的展开下一项即可,如图:

  5. <Redis> 入门X 分布式锁

    分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题: 1.资源共享的竞争问题 2.数据的安全性 分布式锁的解决方案: 1.怎么去获取锁 数据库 zookeeper redis 2.怎么释放 ...

  6. kvm:日常使用

    常用命令 创建新镜像:qemu-img create -f qcow2 /var/lib/libvirt/images/$1.img 100G 创建新镜像:qemu-img create -f qco ...

  7. phtyon,通过while循环简单的用户名和密码登录

    _username='zhangxin' _password='abc123' _username1='zhaopeng' _password1='abc1234' _username2=" ...

  8. 模拟Django的admin自定义stark组件

    1.新建Django项目--新建app:app01和stark--在settings中配置app和数据库--在models.py中新建模型表--完成数据库迁移 2.在stark下的apps.py中: ...

  9. Windows和Linux启动虚拟环境

    快速跳转到Linux操作 Windows启动虚拟环境 <!--tab回车可以补全--> 安装virtualenv pip install virtualenv 创建虚拟环境 方法一: py ...

  10. MySQL MGR源码分析2 - 从start group_replication看MGR代码框架

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 上一篇我们从方案层面讲解了MGR的成员管理和故障恢复.本篇从源码层面捋一捋,通过本篇介绍,除了能够了解如何将 ...