Hie with the Pie
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 5205   Accepted: 2790

Description

The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can afford to hire only one driver to do the deliveries. He will wait for 1 or more (up to 10) orders to be processed before he starts any deliveries. Needless to say, he would like to take the shortest route in delivering these goodies and returning to the pizzeria, even if it means passing the same location(s) or the pizzeria more than once on the way. He has commissioned you to write a program to help him.

Input

Input will consist of multiple test cases. The first line will contain a single integer n indicating the number of orders to deliver, where 1 ≤ n ≤ 10. After this will be n + 1 lines each containing n + 1 integers indicating the times to travel between the pizzeria (numbered 0) and the n locations (numbers 1 to n). The jth value on the ith line indicates the time to go directly from location i to location j without visiting any other locations along the way. Note that there may be quicker ways to go from i to j via other locations, due to different speed limits, traffic lights, etc. Also, the time values may not be symmetric, i.e., the time to go directly from location i to j may not be the same as the time to go directly from location j to i. An input value of n = 0 will terminate input.

Output

For each test case, you should output a single number indicating the minimum time to deliver all of the pizzas and return to the pizzeria.

Sample Input

3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0
0

Sample Output

8
题目描述:
给定一系列点,求从0点出发,走完其它点,可以重复走,回到0点的最短路程.
假设n==4,那么点为0,1,2,3;
路径可能为0 1 2 3 0
0 3 2 1 0
0 3 1 2 0
。。。。。。。 等等,
其实就是1到n-1的排列组合,每次有n-1中选择,需要算出每种状态的值,找到最小值,我们可以设到达j点,已经经过了s,s表示经过点的集合。
采用顺推的写法 dp[s | (1 <<k) ][k]=min(dp[s][j]+d[j][k],dp[s | (1<<k)][k]);
d数组为两点之间的最短路.
#include <stdio.h>
#include <cstring >
#include <cstdlib>
#include <iostream>
#define maxn 12
#define inf 0x3f3f3f3f
using namespace std; int n;
int a[maxn][maxn];
int d[maxn][maxn];
int dp[<<maxn][maxn];
inline void init()
{
memset(d,inf,sizeof(d));
}
void floyed()
{
for(int k=;k<n;k++)
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
void solve()
{
/* for(int j=1;j<n;j++)
{
//dp[0][j]=d[0][j];
dp[1][j]=d[0][j]; }*/
memset(dp,-,sizeof(dp));
dp[][]=;
for(int s=;s< ( << n);s++)
for(int j=;j<n;j++)
{
if( dp[s][j]!=-)
{
for(int k=;k<n;k++)
{
if( (k!=j))
{
if(dp[s | (<<k)][k]==- || (dp[s |(<<k)][k] > (dp[s][j]+d[j][k])))
dp[s | ( << k)][k]=dp[s][j]+d[j][k];
// cout<<dp[s | (1<<k )][k]<<endl;
} }
}
} int ans=inf;
int s=(<<n)-;
/*for(int j=1;j<n;j++)
{
ans=min(ans,dp[s][j]+d[j][0]);
printf("%d\n",dp[s][j]+d[j][0]); }*/
printf("%d\n",dp[s][]); }
int main()
{
//cout<<(1<<2)<<endl;
// freopen("test.txt","r",stdin);
while(~scanf("%d",&n) && n!=)
{
init();
n++;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
scanf("%d",&a[i][j]);
d[i][j]=a[i][j];
}
floyed();
solve();
}
return ;
}

poj 3311(DP + 状态压缩)的更多相关文章

  1. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

  2. POJ 3311 【状态压缩DP】

    题意: 给n个点,给出矩阵代表i到j单向边的距离. 要求,不介意访问每个点的次数,要求访问完每个点,使得路程总和最小. 思路: 由于不介意访问每个点的次数,所以可以先进行FLOYD求出任意两个点之间的 ...

  3. poj 3311(floyd+状态压缩)

    题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP  题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...

  4. poj 1185(状态压缩DP)

    poj  1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...

  5. poj 3254(状态压缩DP)

    poj  3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...

  6. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  7. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  8. hdu_4352_XHXJ's LIS(数位DP+状态压缩)

    题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...

  9. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. bzoj 2326 矩阵乘法

    [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2415  Solved: 1413[Submit][Status][Di ...

  2. 关于如何使用Spring里@AliasFor注解进行注解的封装

    不知道大家每次使用Spring boot的时候有没有看过它启动类里 @SpringBootApplication这个注解呢?众所周知,这个注解是一个复合注解,但是注解是不能继承元注解的属性的,也就是说 ...

  3. msp430入门编程30

    msp430中C语言的文件管理

  4. OC-category 为什么不能添加成员变量

    以下的答案是百度的,仅做记录而已: 1. 利用运行时实际上也不是添加成员变量.已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变.但是通过运行时可以将一个对象或基础类型变成指定 ...

  5. django学习之- Form

    参考:http://www.cnblogs.com/wupeiqi/articles/6144178.htmlFORM中的字段只对post上来的数据进行form验证,主要涉及:字段 和 插件字段:对用 ...

  6. 如何在 Linux 环境下配置 Nagios Remote Plugin Executor (NRPE)

    为 NRPE 配置自定义命令 远程服务器上安装 下面列出了一些可以用于 NRPE 的自定义命令.这些命令在远程服务器的 /etc/nagios/nrpe.cfg 文件中定义. ## 当 1.5.15 ...

  7. CSDN-markdown基本的语法说明

    文件夹 概述 简介Markdown CSDN Markdown的功能支持 标题 Setext形式 atx形式 区块引用 分隔线 强调 列表 无序列表 有序列表 注意事项 链接 自己主动链接 普通文本链 ...

  8. 软件质量之道:PCLint之中的一个

    故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能. 孟子 1引子 今天听老韩一席话,当真是感慨万千啊.心怀斗志昂扬.奋斗十年,到头来.却看到身 ...

  9. AWK教程

    1. IBM:GAWK入门:AWK语言基础 2. Unix AWK使用手册 3. 台湾中研院计算中心ASPAC计划之AWK程序介绍 4. Study-area之AWK 5. AWK学习笔记——酷勤 持 ...

  10. Xcode6 设置LaunchImage图标

    最近设置LaunchImage图标时发现怎么都没有效果,后来发现是Xcode6中新建项目的时候会默认添加一个LaunchScreen.xib的文件,我们启动程序的时候也会发现,加载的时LaunchSc ...