博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TSP问题——动态规划
阅读量:4632 次
发布时间:2019-06-09

本文共 1328 字,大约阅读时间需要 4 分钟。

            Traveling Salesman Problem

  Description:                    Time Limit: 4sec    Memory Limit:256MB

  有编号1到N的N个城市,问从1号城市出发,遍历完所有的城市并最后停留在N号城市的最短路径长度。

  Input:

  第一行整数 T :T组数据 (T<=20) 

  每个case 读入一个N( 2 <= N <= 20),接着输入N行,第i行有两个整数 xi , yi 表示第 i 个城市坐标轴上的坐标 。

  Output:

  每个case输出一个浮点数表示最短路径。四舍五入保留两位小数。

  Sample Input:

  1 4 0 0 1 0 1 1 0 1

  Sample Output:

  3.41

 

  经典难题!数据开到这么小就知道没有那么简单的复杂度了,一般的算法,即爆搜,复杂度为 o( n! ) ,我们这里采用的动态规划算法,

  算法复杂度已经从阶乘级降到了o( ( n^2 )*( 2^n ) ) (看起来也是相当恐怖的,不过像这种经典难题这种复杂度对我来说已经不错了)。

 

  开始说说思路,一开始马上想到的必然是搜索,搜索必然超时,于是某大神直接告诉我——记忆化搜索,记忆化搜索能做的动规就能做,写递归太麻烦了于是动规!

  题目中起点终点确定,我们可以考虑用一个二维dp数组来保存一个状态——dp[i]{V}表示从结点0到结点 i 途经V中所有节点的最短路径长(这里的V是一个集合)

  于是状态转移方程可以为:dp[i]{V}=min( dp[i]{V} , dist[i][j]+dp[j]{V-{j}} )  (j 属于 V)

  

  大思路定好了,我们来考虑细节部分,主要有以下部分:

  1)建图等等:结构体point,距离函数dist;

  2)集合V的表示:二进制数,即010表示三个数的集合第二个有,其余无;

  3)dp过程的范围:1 ~ n-1 (最大可能为 1 ~ 18 );

  

  于是我们可以敲代码啦!

#include 
const double INF=10e7;using namespace std;int T,n,cnt;double a[25][25],dp[25][1100000];struct point{ //结点结构体 int x,y;}pt[25];double d(point a,point b){ //结点间距离 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int main(){ scanf("%d",&T); while(T--) { cnt=1; scanf("%d",&n); for(int i=2;i

  之前动态规划也是做了不少的基础例题,这道题算是动态规划的第一次成功应用,还是蛮开心的,软创得加油啊!

 

  

转载于:https://www.cnblogs.com/godding/p/4059959.html

你可能感兴趣的文章
SQL查询强化训练(2)
查看>>
Django 分页
查看>>
layuiAdmin 项目修改
查看>>
创新点子:博客图文混编工具
查看>>
NSUserDefault、NSMutableDictionary的setValue和setObject区别
查看>>
TreeSet&第三方比较器&Map
查看>>
经典算法mark
查看>>
http://channel9.msdn.com/Events/MIX
查看>>
静态页面:html5个人博客模板《绅士》
查看>>
mvc 基础概念
查看>>
mysql数据恢复
查看>>
kali 插耳机没声音
查看>>
Codeforces Round #294 (Div. 2) D. A and B and Interesting Substrings
查看>>
如何巧妙使用ZBrush中的Image Plane插件
查看>>
windows安装theano和keras
查看>>
141. Linked List Cycle
查看>>
169. Majority Element
查看>>
51NOD 1087 1 10 100 1000
查看>>
谈谈javascript语法里一些难点问题(一)
查看>>
jQuery 遍历同胞(siblings)
查看>>