poj 3311 Hie with the Pie (状压dp) (Tsp问题)
这道题就是Tsp问题,稍微加了些改变
注意以下问题
(1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离
(2)在循环中集合可以用S表示更清晰一些
(3)第一维为状态,第二维为在哪个点,不要写混。
(4)在dp过程中0这个点是不用的,只用到1到n这个点
而实际上dp过程中用的是0到n-1,所以就枚举1到n,然后涉及到集合的地方就写i-1
其他地方如dp的第二维,距离这些都不变。
还有一个方法,是我一开始想的方法,就是在输入的时候就把0放到第n个点,其他下标-1
(4)这道题求最小值,一定要先初始化为最大值
方法一(涉及到集合的时候下标-1)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n;
int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[i][j]);
_for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
memset(dp, 0x3f, sizeof(dp));
_for(i, 1, n) dp[1 << (i - 1)][i] = dist[0][i];
REP(S, 0, 1 << n)
_for(i, 1, n) if(S & (1 << (i - 1)))
_for(j, 1, n) if(S & (1 << (j - 1)))
dp[S][i] = min(dp[S][i], dp[S^(1<<(i-1))][j] + dist[j][i]);
int ans = 1e9;
_for(i, 1, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][0]);
printf("%d\n", ans);
}
return 0;
}
方法二(直接在输入的时候改变)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n;
int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[(!i ? n : i - 1)][(!j ? n : j - 1)]);
_for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
memset(dp, 0x3f, sizeof(dp));
REP(i, 0, n) dp[1 << i][i] = dist[n][i];
REP(i, 0, 1 << n)
REP(j, 0, n) if(i & (1 << j))
REP(k, 0, n) if(i & (1 << k))
if(j != k)
dp[i][j] = min(dp[i][j], dp[i^(1<<j)][k] + dist[k][j]);
int ans = 1e9;
REP(i, 0, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][n]);
printf("%d\n", ans);
}
return 0;
}
poj 3311 Hie with the Pie (状压dp) (Tsp问题)的更多相关文章
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...
- East Central North America 2006 Hie with the Pie /// 状压dp oj22470
题目大意: 输入n,有n个地方(1~n)需要送pizza pizza点为0点 接下来n+1行每行n+1个值 表示 i 到 j 的路径长度 输出从0点到各点送pizza最后回到0点的最短路(点可重复走) ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...
- POJ 3311 Hie with the Pie (状压DP)
题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...
- POJ3311 Hie with the Pie 【状压dp/TSP问题】
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total ...
- poj 3311 Hie with the Pie
floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Me ...
- Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...
- POJ 3311 Hie with the Pie(Floyd+状态压缩DP)
题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...
随机推荐
- 【explain】MySQL联表查询中的驱动表
写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...
- 对thinkpad太失望了
本来本着对thinkpad的信任买的,结果买回来一直吱吱吱吱响个不停. 好像是磁盘的问题,太垃圾了. http://benyouhui.it168.com/thread-1111376-1-1.htm ...
- HDU 2815
特判B不能大于等于C 高次同余方程 #include <iostream> #include <cstdio> #include <cstring> #includ ...
- HDU-1042-N!(Java大法好 && HDU大数水题)
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- NAT配置
静态NAT Router(config)#ip nat inside source static tcp 192.168.100.2 61.159.62.131 指定地址转换映射 Router(c ...
- 创建cifs系统案例之“实现将Windows磁盘共享至Linux”
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...
- Word技巧杂记(二)——批量修改修订格式并接受
今天的题目好奇怪啊,呵呵,起因如下: 今天老婆在修改论文,她的老板提出一个非常**的要求——把Word中所有修订后的文字用特殊的字体(蓝色)标出来,然后再接受修订.我勒个去,明明有修订后的模式啊,为什 ...
- 杂项:CMM
ylbtech-杂项:CMM CMM是指“能力成熟度模型”,其英文全称为Capability Maturity Model for Software,英文缩写为SW-CMM,简称CMM.它是对于软件组 ...
- [MySQL] 查询一段时间记录
24小时内记录(即86400秒) $sql="SELECT video_id,count(id)as n FROM `rec_down` WHERE UNIX_TIMESTAMP(NOW() ...
- maven、spring jdbc与mysql、mybatis
以它们之前的一个简单用例作为实例. 一个简单的能跑起来的实例.原文网址.非常好的例子. http://www.open-open.com/lib/view/open1390534380648.html ...