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;
}

最新文章

  1. python学习——将while循环改成函数
  2. AT指令(转)
  3. JAVA设计模式之建造模式
  4. Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了
  5. Task&lt;TResult&gt; 类
  6. Uniform Generator 分类: HDU 2015-06-19 23:26 11人阅读 评论(0) 收藏
  7. AutoReleasePool 和 ARC 以及Garbage Collection
  8. 图片--android 图片占用内存与什么有关
  9. 自定义WM_NOTIFY消息
  10. [PWA] 15. Using The IDB Cache And Display Entries
  11. 警告框和操作表(IOS开发)
  12. 生成md5密码
  13. H3C TE老版本OSPF正确配置
  14. 仿jQuery之链式调用
  15. Naive Bayes在mapreduce上的实现
  16. 利用fiddler和mock调试本地微信网页
  17. CodeForces - 730A 贪心+模拟
  18. 第一周Python学习笔记
  19. 2018年年度总结 &amp; 2019年计划
  20. Java中ArrayList和LinkedList区别(转)

热门文章

  1. jekyll 将纯文本转化为静态网站和博客 静态网站生成器
  2. 1.C#冒泡排序
  3. Android Bitmap详细介绍(3)
  4. 关于C/C++的一些思考(1)
  5. 18Spring后置通知
  6. SQlServer中的MD5加密
  7. java生成6位随机数字
  8. c++中的string常用函数用法总结!
  9. tarjan 割点 割边
  10. 关于iphone 微信浏览器编码问题