tyvjP1288 飘飘乎居士取能量块

P1288 飘飘乎居士取能量块

时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

9月21日,pink生日;9月22日,lina生日;9月23日,轮到到飘飘乎居士(狂欢吧,(*^__^*) 嘻嘻……)。

描述

9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦!
  为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块。后花园一共被划分n个地区,能量块被分散在里面,现在飘飘乎居士拿出地图,发现自己站在1的地方,而他要做的就是用最短的路程把所有的能量块取出,并且最后走到位于n的出口处,而飘飘乎居士一直是个懒人,他想知道最少要走多少路程才能够取到所有的能量块,并且走到出口

输入格式

第一行一个正整数n,表示花园被划分成了n个地区
接下来一个n*n的矩阵,代表个点之间的相互距离,数据保证从i走到i没有路程
在下来一个整数p,表示一共有p个能量块
接下来一行,表示各个能量块的位置,数据保证1和n没有能量块,且每个地区最多一个能量块
对于所有的数据 0<n<=100  0<=P<=10 任意两点的距离为一个小于1000的正整数

输出格式

一个数,飘飘乎居士所要行走的最小距离

测试样例1

输入

3

0 10 1

3 0 5

1 2 0

1

2

输出

7

备注

花园被分为3个地区,在2号地区有能量块,飘飘乎居士行走的路线如下
1->3->2->1->3
行走的总路程为7,也就是最后的答案。

题解:

裸状压。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <algorithm>
 6 #define max(a, b) a > b ? a : b
 7 #define min(a, b) a < b ? a : b
 8
 9 inline void read(int &x)
10 {
11     x = 0;char ch = getchar();char c = ch;
12     while(ch > ‘9‘ || ch < ‘0‘)c = ch, ch = getchar();
13     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
14     if(c == ‘-‘)x = -x;
15 }
16
17 const int MAXN = 100 + 10;
18 const int MAXP = 10 + 5;
19
20 int g[MAXN][MAXN], n, p, dir[MAXP], ok1, ok2;
21 int f[MAXN][1 << MAXP];
22
23 int main()
24 {
25     memset(f, 0X3f, sizeof(f));
26     read(n);
27     for(register int i = 1;i <= n;++ i)
28         for(register int j = 1;j <= n;++ j)
29             read(g[i][j]);
30     for(register int k = 1;k <= n;++ k)
31         for(register int i = 1;i <= n;++ i)
32             for(register int j = 1;j <= n;++ j)
33                 g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
34     read(p);
35     for(register int i = 1;i <= p;++ i)
36     {
37         read(dir[i]);
38         if(dir[i] == 1) ok1 = true;
39         else if(dir[i] == n) ok2= true;
40     }
41     if(!ok1) dir[++ p] = 1;
42     if(!ok2) dir[++ p] = n;
43
44     std::sort(dir + 1, dir + 1 + p);
45     f[1][1] = 0;
46     //f[i][S]表示从1出发走到点i,取到了S的能量块的最短路径
47     register int M = 1 << p, now, tmp;
48     for(register int S = 1;S < M;++ S)
49     {
50         for(register int i = 1;i <= p;++ i)
51         {
52             if(!(S & (1 << (i - 1))))continue;
53             now = dir[i];
54             for(register int j = 1;j <= p;++ j)
55             {
56                 if(i == j)continue;
57                 if(!(S & (1 << (j - 1))))continue;
58                 tmp = dir[j];
59                 f[now][S] = min(f[now][S], f[tmp][S ^ (1 << (i - 1))] + g[tmp][now]);
60             }
61         }
62     }
63     printf("%d", f[n][M - 1]);
64     return 0;
65 }

tyvj1288

时间: 2024-09-30 15:56:00

tyvjP1288 飘飘乎居士取能量块的相关文章

P1143 飘飘乎居士的约会

P1143 飘飘乎居士的约会 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 一阵狂风吹过  只听“pong”的一声,飘飘乎居士降落了!!! 描述 又是美妙的一天,这天飘飘乎居士要和MM约会,因此他打扮的格外帅气.但是,因为打扮的时间花了太久,离约会的时间已经所剩无几.幸运的是,现在飘飘乎居士得到了一张n*m的地图,图中左上角是飘飘乎居士的位置,右下角是约会的地点.‘.’代表马路,‘*’代表房屋.飘飘乎居士只能沿着‘.’行走(也就是不能踏入‘*’),而且

基于Casperjs的网页抓取技术【抓取豆瓣信息网络爬虫实战示例】

CasperJS is a navigation scripting & testing utility for the PhantomJS (WebKit) and SlimerJS (Gecko) headless browsers, written in Javascript. PhantomJS是基于WebKit内核的headless browser SlimerJS则是基于Gecko内核的headless browser Headless browser: 无界面显示的浏览器,可以用于

分享取实际网卡MAC地址的一种方法

近期由于监管要求,需要在做业务的时候将机器的mac地址也要上报,之前的代码其实已经实现了取mac地址的功能,但是存在一个问题,如果有多块网卡的时候或者装了虚拟机的情况下就尴尬了,之前的代码默认是取第一块网卡的MAC地址,这样就不符合要求.由于技术功底不扎实,不知道如何判断到底实际网卡是哪一块,后来想到了一种歪门邪道的方法,在这里做个笔记和分享. 主要问题:不知道客户端跟服务器之间到底是走的哪块网卡 解决办法:那就想办法确定这块网卡 主要是在对客户端连接服务器成功后进行处理: 第一步:客户端连接成

Android&quot;挂逼&quot;修炼之行---支付宝蚂蚁森林能量自动收取插件开发原理解析

一.前言关于支付宝的蚂蚁森林能量收取这个非常有重大意义的东西,本人表示非常认同,这个网上也是一直有人觉得马云是一个非常有远见的男人,的确虽然很多人觉得马云不会技术但是很能说,但是他说的都慢慢实现了,先不管这个种树到底能不能落实,马云的确在带领着阿里帮助世界地球变得越来越美好,而隔壁的企鹅公司暂时不评论.我们如果玩过能量收取都知道他有一个弊端就是每天早起收能量有时候会发现自己的能量被别人全部偷完了很不爽,而且自己在收取的时候也会发现非常的慢和难受,特别在好友比较多的时候.所以针对这么多问题就开发了

LeetCode 1388. Pizza With 3n Slices(3n 块披萨)(DP)

给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选 任意 一块披萨.Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨.Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨.重复上述过程直到没有披萨剩下.每一块披萨的大小按顺时针方向由循环数组 slices 表示. 请你返回你可以获得的披萨大小总和的最大值. 示例 1: 输入:slices = [1,2,3,4,5,6]输出:10解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

什么阻碍了强人工智能的发展

版本:0.1 当今科学虽然非常发达了,但还是没能很好的理解和解释我们的世界.三个基本问题仍然困扰着我们:最小的是什么,最大的是什么和意识是什么.所谓最小,即最小的物质是什么.虽然我们证明了上帝粒子,快要证明各种粒子的统一和完备性了.但再往小了看呢,这些基本粒子又是什么组成的?这一层一层分析下去,是否有尽头?我们还要不断的了解更小粒子.逼近真理.所谓最大,我们可视的宇宙之外是什么?我们可视的宇宙之内,看不见的暗物质.暗能量是什么?是否有我们的世界和其完全没有作用力的黑物质和能量存在?最大和最小的问

从另一个角度看癌症,现象、结果并不一定是病因!

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 早上刚醒,不知怎地,有了关于癌症的一些辩证想法, 其实,很多事情不是没有解决办法,而是看问题所站的角度不同, 所以,微信网传的那个外国人弄出的 Y

E. 玩游戏

E. 玩游戏 运行时间限制: 1000 运行内存限制: 65536 作者: scsyuanbaoku 是否specialjudge: False 题目描述 你正在玩一款新的游戏,在游戏中你有N个用于给你的战士补充能量的道具和M个战士.这N个道具都有一个能量值,代表该道具能给战士提供的总能量,给战士补充后该值会永久减少,该值为0后该道具就没有用了.例如某道具的能量值为500,如果用它给一个战士补充了300的能量,则该道具的能量值变为200.现在你要带领你的战士们出征了,在出征前你要给这M个战士补充