vijosP1014 旅行商简化版
2016-03-30 17:27
351 查看
vijosP1014 旅行商简化版
链接:https://vijos.org/p/1014
【思路】
双线DP。
设ab,ab同时走。用d[i][j]表示ab所处结点i、j,且定义i>j,则有转移方程:
d[i][j]=min{ d[i+1][j]+dist(i,i+1),d[i+1][i]+dist(j,i+1) };
另外需要注意坐标也需要用double读入。
(vj貌似出了些许问题,无论是我的代码还是以前AC的人的代码都过不了)
【代码】
PS:相比较而言,记忆化搜索要比递推写法简单,只需要设定好返回边界即可,不会有太多的遗漏。
链接:https://vijos.org/p/1014
【思路】
双线DP。
设ab,ab同时走。用d[i][j]表示ab所处结点i、j,且定义i>j,则有转移方程:
d[i][j]=min{ d[i+1][j]+dist(i,i+1),d[i+1][i]+dist(j,i+1) };
另外需要注意坐标也需要用double读入。
(vj貌似出了些许问题,无论是我的代码还是以前AC的人的代码都过不了)
【代码】
1 #include<cstdio> 2 #include<cmath> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 1000+10; 8 struct Node{ 9 double x,y; 10 bool operator<(const Node& rhs) const{ 11 return x<rhs.x || (x==rhs.x && y<rhs.y); 12 } 13 }nodes[maxn]; 14 double f[maxn][maxn]; 15 bool vis[maxn][maxn]; 16 int n; 17 18 inline double dist(int i,int j){ 19 return sqrt((nodes[i].x-nodes[j].x)*(nodes[i].x-nodes[j].x)+(nodes[i].y-nodes[j].y)*(nodes[i].y-nodes[j].y)); 20 } 21 22 double dp(int i,int j) { 23 double &ans=f[i][j]; 24 if(vis[i][j]) return ans; 25 vis[i][j]=1; 26 27 if(i==n) return ans=dist(j,n); 28 29 return ans=min(dp(i+1,j)+dist(i,i+1),dp(i+1,i)+dist(j,i+1)); 30 } 31 32 int main(){ 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++) scanf("%lf%lf",&nodes[i].x,&nodes[i].y); 35 sort(nodes+1,nodes+n+1); 36 if(n==1) printf("0.00\n"); 37 else printf("%.2lf\n",dp(2,1)+dist(1,2)); 38 return 0; 39 }
PS:相比较而言,记忆化搜索要比递推写法简单,只需要设定好返回边界即可,不会有太多的遗漏。
相关文章推荐
- NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )
- NOI题库05 派
- 洛谷1144 最短路计数
- 洛谷1265 公路修建
- 洛谷1339 热浪(最短路模板)
- 洛谷1341 无序字母对
- 洛谷1462 通往奥格瑞玛的道路
- 洛谷1828 香甜的黄油
- 洛谷1119 灾后重建
- UVa11090 Going in Cycle!!
- WinPcap权威指南(一)
- 限制UITextField手机号只能输入11位
- ubuntu下MySQLdb模块安装
- 非阻塞型算法
- 软件测试Exercise Section 2.3 第七题
- leetCode之旅(12)-反转二叉树
- 时间选择器 无论如何都只显示2038年
- 1015. 德才论
- 穷举法解决问题
- 1014. 福尔摩斯的约会