poj3311(状态压缩dp)
来源:互联网 发布:程序员离职交接文档 编辑:程序博客网 时间:2024/06/06 00:40
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
30 1 10 101 0 1 210 1 0 1010 2 10 00
Sample Output
8
题意:输入一个数n,现在有n个地方(标号1到n)要从标号为0的地方出去,经过所有的地方之后回来,求最短的时间,输入(n+1)*(n+1)的矩阵表示每两点之间到达所需要的时间。
思路:用dp[i][j]表示状态i下以j结尾的最短时间。由于不知道每两个点之间到底怎么走时间最短,用floyd求一下最短路程,然后进行dp。
#include <iostream>#include <stdio.h>#include <stdlib.h>#include<string.h>#include<algorithm>#include<math.h>#include<queue>using namespace std;typedef long long ll;int dp[1<<11][11];///dp[i][j]表示i状态下以j结尾的最短时间int tu[15][15];int n;const int INF=99999999;void floyd()///floyd求两点间的最短路{ for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++) tu[i][j]=min(tu[i][j],tu[i][k]+tu[k][j]);}int main(){ while(~scanf("%d",&n)&&n++) { for(int i=0; i<(1<<n); i++) for(int j=0; j<n; j++) dp[i][j]=INF; for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&tu[i][j]); floyd(); for(int i=1; i<n; i++) dp[1<<i][i]=tu[0][i]; for(int j=0; j<1<<n; j++) for(int i=0; i<n; i++) if(dp[j][i]!=INF) for(int k=1; k<n; k++) if(!(j&(1<<k))) dp[j|(1<<k)][k]=min(dp[j][i]+tu[i][k],dp[j|(1<<k)][k]); int ans=INF; for(int i=1; i<n; i++) ans=min(dp[(1<<n)-2][i]+tu[i][0],ans); cout<<ans<<endl; } return 0;}
- poj3311(状态压缩dp)
- poj3311 状态压缩dp
- POJ3311(TSP问题,状态压缩DP)
- POJ3311(状态压缩DP+Floyd)
- POJ3311 Hie with the Pie(状态压缩dp)
- 二进制状态压缩dp(旅行商TSP)POJ3311
- poj3311 Hie with the Pie(状态压缩dp)
- poj3311 状态压缩
- POJ3311——Hie with the Pie(状态压缩DP)
- POJ3311——Hie with the Pie(floyd,状态压缩dp,旅行商)
- POJ3311:Hie with the Pie(floyd+状态压缩DP)
- 【POJ3311】Hie with the Pie(状态压缩DP)
- 状态压缩DP总结【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】
- [Floyd+状态压缩DP]poj3311 Hie with the Pie
- POJ3311:Hie with the Pie(floyd+状态压缩DP)
- 《挑战程序设计竞赛》3.4.1 动态规划-状态压缩DP POJ3311 2686 2411 2441 3254 2836 1795 3411(2)
- 状态压缩DP总结【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】
- 状态压缩DP总结【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】
- 数据库读写分离
- c++里的string类
- 解决QT使用mysql编译时不能连接数据库的问题
- GDAL实现读写ESRI ArcGIS的shapfile文件
- 使用cropbox实现图片剪切上传
- poj3311(状态压缩dp)
- js父窗口和子窗口之间传值
- MySQL的limit是针对结果集进行分页。
- iOS关于NSCharacterSet 的用法
- redis3.0 cluster功能介绍
- 用java实现输入日期后得到这个日期是这一年的第多少天
- 3月24日学习笔记(调用隐式Intent启动浏览器)
- 各种基本算法实现小结(四)—— 图及其遍历
- 操作系统读写文件涉及的存储部件