dp tsp问题 海贼王之伟大航路
TSP问题是一个np问题 但是我们可以通过伪多项式算法来实现 就是用状态压缩dp
dp[i][j]:i是目前已经走过的城市的状态 j是在此状态下最后一个到达的城市 dp[i][j]表示到此时的最小用时 如果状态转移不合法 设置为
-1 那怎么来递推呢 我们想一想 如果一个i要从 00000000001(二进制表示) 走过来 那么所走的状态一定都是小于i的 比如
i=000000101 要从 000000001 或者 0000000100走过来一样 所以i从小到大就可以了!
状态转移方程dp[i][j]=min(dp[i][j],dp[state][k]+mat[k][j]) 其中state 和k是枚举合法的 。
7:海贼王之伟大航路
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
“我是要成为海贼王的男人!”,路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程。
路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着“唯一的大秘宝”——ONE PIECE)。而航程中间,则是各式各样的岛屿。
因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到A岛则可能需要1年。当然,任意两个岛之间的航行时间虽然差别很大,但都是已知的。
现在假设路飞一行从罗格镇(起点)出发,遍历伟大航路中间所有的岛屿(但是已经经过的岛屿不能再次经过),最后到达拉夫德鲁(终点)。假设他们在岛上不作任何的停留,请问,他们最少需要花费多少时间才能到达终点?
- 输入
-
输入数据包含多行。
第一行包含一个整数N(2 < N ≤ 16),代表伟大航路上一共有N个岛屿(包含起点的罗格镇和终点的拉夫德鲁)。其中,起点的编号为1,终点的编号为N。
之后的N行每一行包含N个整数,其中,第i(1 ≤ i ≤ N)行的第j(1 ≤ j ≤ N)个整数代表从第i个岛屿出发到第j个岛屿需要的时间t(0 < t < 10000)。第i行第i个整数为0。 - 输出
- 输出为一个整数,代表路飞一行从起点遍历所有中间岛屿(不重复)之后到达终点所需要的最少的时间。
- 样例输入
-
样例输入1: 4 0 10 20 999 5 0 90 30 99 50 0 10 999 1 2 0样例输入2: 5 0 18 13 98 8 89 0 45 78 43 22 38 0 96 12 68 19 29 0 52 95 83 21 24 0
- 样例输出
-
样例输出1: 100样例输出2: 137
- 提示
-
提示:
对于样例输入1:路飞选择从起点岛屿1出发,依次经过岛屿3,岛屿2,最后到达终点岛屿4。花费时间为20+50+30=100。
对于样例输入2:可能的路径及总时间为:
1,2,3,4,5: 18+45+96+52=211
1,2,4,3,5: 18+78+29+12=137
1,3,2,4,5: 13+38+78+52=181
1,3,4,2,5: 13+96+19+43=171
1,4,2,3,5: 98+19+45+12=174
1,4,3,2,5: 98+29+38+43=208
所以最短的时间花费为137
单纯的枚举在N=16时需要14!次运算,一定会超时。 -
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <iostream> #include <sstream> #include <ostream> #include <algorithm> #include <ctype.h> #include <cmath> #include <queue> #include <set> #include <map> #include <vector> #define inf 1e9+7 #define pi acos(-1) #define natrule exp(1) using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") int mat[50][50]; int dp[500000][20]; int main(){int n;while(cin>>n){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>mat[i][j];}}memset(dp,-1,sizeof(dp));int all=(1<<n)-1;dp[1][1]=0;for(int i=2;i<=all;i++){for(int k=1;k<=n;k++){int c=1<<(k-1);if((c&i)==0) continue;int state=i-c;for(int j=1;j<=n;j++){if(dp[state][j]==-1) continue;else {if(dp[i][k]==-1) dp[i][k]=dp[state][j]+mat[j][k];else dp[i][k]=min(dp[i][k],dp[state][j]+mat[j][k]);}}}}/* for(int i=1;i<=((1<<n)-1);i++){for(int j=1;j<=n;j++){cout<<dp[i][j]<<' ';}}cout<<endl;*/cout<<dp[(1<<n)-1][n];}return 0;}
dp tsp问题 海贼王之伟大航路相关推荐
- Bailian4124 海贼王之伟大航路【DP】
4124:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的 ...
- 百练4124:海贼王之伟大航路(状压DP)
题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 " ...
- 海贼王之伟大航路——状压记忆化搜索
海贼王之伟大航路 题意: 一共 n 个点,给定任意两点的距离 dis[i,j]dis[i, j]dis[i,j]. 问,从点 1 到点 n,中途所有节点经过且仅经过一次,距离最短为多少? (2< ...
- bailianoj 4124海贼王之伟大航路
bailianoj 4124海贼王之伟大航路 题目大意 以第一个岛为起点,最后一个岛为终点.问从第一个岛到最后一个岛所需要的的最短时间是多少.其中岛i到岛i所需花费的时间为0,岛i岛到j的时间和岛j到 ...
- 北京大学OpenJudge 4124:海贼王之伟大航路
4124:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的 ...
- POJ h0248.海贼王之伟大航路
海贼王之伟大航路 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历程. 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿 ...
- 【算法练习】动态规划/搜索/状态压缩 百练poj4124:海贼王之伟大航路
参考链接:https://www.twblogs.net/a/5b8ceaac2b7177188336e93d/zh-cn 题目链接:http://bailian.openjudge.cn/pract ...
- 【算法练习】搜索/剪枝 百炼 poj4124:海贼王之伟大航路
参考blog:http://blog.sina.com.cn/s/blog_a8efbf5d0102vo9u.html 题目链接:http://bailian.openjudge.cn/practic ...
- POJ海贼王之伟大航路(dfs)
C:海贼王之伟大航路 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王的男人!",路飞一边喊着这样的口号,一边和他的伙伴们一起踏上了伟大航路的艰险历 ...
最新文章
- Linux如何实现断点续传文件功能?
- 简颢集团“风口”下的投资机会 新能源共享领域的机遇与挑战
- activty在哪个栈里面_第二篇Activity:2、任务和返回堆栈(Tasks and Back Stack)之基本介绍...
- HB-X打不开的解决办法
- 记一次服务器执行MySQL耗时问题
- 2017.7.27 bill的挑战 失败总结
- leetcode力扣406. 根据身高重建队列
- Vue:数组的过滤排序显示客户端实现
- 创建一棵二叉树(C++)以及遍历
- Qt moc文件缺少“stdafx.h”异常
- HTML零基础入门教程(详细)
- 在 ubuntu 的桌面上创建快捷方式
- 台式计算机无线上网设置,台式机如何设置无线上网
- 天龙八部服务器维护怎么进去,天龙八部怎么进不去?维护了吗?到什么时候?...
- 新的我们、新的梦想、新的目标、新的未来 —— 44期开班贴
- 金蝶苍穹,报表查询插件
- NPDP产品经理认证考试精华知识点汇总一:新产品开发战略
- 计算机 蚂蚁搬家 教案,《观察蚂蚁搬家》教学设计
- 洛谷 - 一些好玩的问题
- batocera整合包_OGA 官方固件 + Retroarch + 睡眠模式 ES整合包