//  [9/19/2014 Sjm]
/*
dis[j][k] := 从 j 点到 k 点的最少步数,由于They can travel in all 8 adjacent direction in one step.故而 dis[j][k] = max( abs(Xj - Xk), abs(Yj - Yk) )f[j][i] := 在 i 状态下,最后收集坚果 j 的最少步数n 代表坚果的数目。。阶段i:按递增顺序枚举状态值 (0 <= i <= 2^n - 1)
状态 :枚举状态 i 中最后被收集的坚果 j (1 <= j <= n, i&(2^(j-1)) != 0)
决策 :枚举状态 i 以外的坚果 k(1 <= k <= n, i&(2^(k-1)) == 0) ,判断在状态 i,最后被收集的坚果为j的情况下,再收集坚果 k ,是否为最优决策。即: f[k][i+2^(k-1)] = min(f[k][i+2^(k-1)], f[j][i] + dis[j][k])求最终解:
枚举 f[j][2^n - 1] + dis[j][0] (1 <= j <= n),
*/
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #define INF 0x3f3f3f3f
 6 using namespace std;
 7 int n, dis[20][20], myX, myY, f[20][(1 << 20)];
 8
 9 struct myNode {
10     int x, y;
11 }node[20];
12
13 void Init(int i, char str[])
14 {
15     for (int j = 0; j < myY; ++j){
16         if ('#' == str[j]) {
17             node[++n].x = i;
18             node[n].y = j;
19         }
20         else if ('L' == str[j]) {
21             node[0].x = i;
22             node[0].y = j;
23         }
24     }
25 }
26
27 void getDis() {
28     for (int i = 0; i <= n; ++i) {
29         for (int j = 0; j <= n; ++j) {
30             dis[i][j] = max(abs(node[i].x - node[j].x), abs(node[i].y - node[j].y));
31         }
32     }
33 }
34
35 void Solve() {
36     int finalState = (1 << n) - 1;
37     for (int j = 1; j <= n; ++j) {
38         for (int i = 0; i <= finalState; ++i) {
39             f[j][i] = INF;
40         }
41     }
42     for (int j = 1; j <= n; ++j) {
43         f[j][1 << (j - 1)] = dis[0][j];
44     }
45     for (int i = 0; i < finalState; ++i) {
46         for (int j = 1; j <= n; ++j) {
47             if (i & (1 << (j - 1))) {
48                 for (int k = 1; k <= n; ++k) {
49                     if (!(i & (1 << (k - 1)))) {
50                         f[k][i + (1 << (k - 1))] = min(f[k][i + (1 << (k - 1))], f[j][i] + dis[j][k]);
51                     }
52                 }
53             }
54         }
55     }
56     int ans = INF;
57     for (int j = 1; j <= n; ++j) {
58         ans = min(ans, f[j][finalState] + dis[j][0]);
59     }
60     printf("%d\n", ans);
61 }
62
63 int main()
64 {
65     while (~scanf("%d %d", &myX, &myY)) {
66         char str[25];
67         n = 0;
68         for (int i = 0; i < myX; ++i) {
69             scanf("%s", str);
70             Init(i, str);
71         }
72         if (0 == n) {   // 注意无坚果的情况。。
73             printf("0\n");
74             continue;
75         }
76         getDis();
77         Solve();
78     }
79     return 0;
80 }

转载于:https://www.cnblogs.com/shijianming/p/4140800.html

状态压缩 之 UVA 10944 - Nuts for nuts..相关推荐

  1. UVA 11825 状态压缩DP+子集思想

    很明显的状态压缩思想了.把全集分组,枚举每个集合的子集,看一个子集是否能覆盖所有的点,若能,则f[s]=max(f[s],f[s^s0]+1).即与差集+1比较. 这种枚举集合的思想还是第一次遇到,果 ...

  2. UVA - 1633 Dyslexic Gollum 状态压缩

    问题 输入N,K(N<=400,K<=10),求长度为N且不含有长度至少为K的连续回文子串的01字符串有多少个? 分析 输入k,要判断k,k+1的情况,因为一个字符串有长度为k的回文子串, ...

  3. pat 食物链(状态压缩求哈密顿回路)

    状态压缩求哈密顿回路 #include<bits/stdc++.h> using namespace std; bool dp[23][1<<21]; char s[22][2 ...

  4. POJ-1753 Flip Game 枚举 状态压缩

    刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来--- 这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了.再运用位运算将状 ...

  5. 状压DP Hiho-1044 状态压缩

    状态压缩 [HihoCoder - 1044] 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小 ...

  6. POJ-1185 炮兵阵地 动态规划+状态压缩

    由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...

  7. 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]

    题目链接 题目大意: 一棵根为1 的树,每条边上有一个字符(a−va−va−v共22种). 一条简单路径被称为Dokhtar−kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树 ...

  8. 点分治问题 ----------- HDU 5977 or 2016年大连ICPC [点分治+状态压缩]

    题目链接 题目大意: 就是给你一颗树,树上有各种权值,权值只有K种k∈[1,10]K种k\in[1,10]K种k∈[1,10],问你有多少路径覆盖了这KKK种权值,n∈[1,5e4]n\in[1,5e ...

  9. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

最新文章

  1. 认识Backbone (四)
  2. MIPS指令以及数据通路
  3. 二十一世纪Windows简史
  4. Flex builder3与eclipse整合 转载
  5. rtmp协议 java_基于rtmp协议的java多线程服务器
  6. Excel数据透视表经典教程三《数据透视表背后原理》
  7. matlab之统计和机器学习工具箱
  8. HC-SR04超声波模块测距原理与原理图
  9. 百度移动统计热力图和事件分析的坑
  10. linux 查看用户名
  11. 次世代3D建模的制作流程与制作时间,一个模型就上万,钱真不好拿
  12. request库的基本用法
  13. 为什么postgresql最大的单表只能是32TB
  14. 病原微生物高通量测序:第一节 概述
  15. 嵌入式 BT656/BT601/BT1120协议差异小结
  16. Android OTA版本任意升级
  17. 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)
  18. 计算机网络实验--验证性实验
  19. pymysql模块和SQL注入
  20. 基于Springboot的新冠疫情可视化管理系统(可视化展示+后台管理功能)

热门文章

  1. Fetch发送网络请求
  2. LeetCode 1770. 执行乘法运算的最大分数(DP)
  3. Python发送文本邮件
  4. LeetCode 1196. 最多可以买到的苹果数量(贪心)
  5. LeetCode 68. 文本左右对齐(字符串逻辑题)
  6. LeetCode 第 18 场双周赛(188/587,前32%)
  7. 计算机网络路由选择协议,IP路由选择协议原理和作用
  8. linux socket 面试题,面试题
  9. java初学者定远期目标_JAVA题,新手求解
  10. Hadoop学习之yarn