John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must determine the shortest closed tour that connects his destinations. Each destination is represented by a point in the plane pi = < xi, yi > . John uses the following strategy: he starts from the leftmost point, then he goes strictly left to right to the rightmost point, and then he goes strictly right back to the starting point. It is known that the points have distinct x -coordinates. Write a program that, given a set of n points in the plane, computes the shortest closed tour that connects the points according to John’s strategy.
【题目分析】
转化之后进行动态规划。详情请查看 这里(点我,^_^,点我)
【代码】
#include<cstdio>
#include<cstring>
#include<cmath>
double min(double x,double y)
{return x<y?x:y;}
double map[1001][1001],dp[1001][1001],x[1001],y[1001];
int main()
{
int n;
while (scanf("%d",&n)==1)
{
for (int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
map[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
for (int i=1;i<n;i++)
dp[n][i]=map[i][n];
for (int i=n-1;i>=2;i--)
for (int j=i;j>=1;j--)
dp[i][j]=min(dp[i+1][j]+map[i][i+1],dp[i+1][i]+map[j][i+1]);
printf("%.2lf\n",dp[2][1]+map[1][2]);
}
}
本文介绍了一个基于动态规划算法的问题:如何找到连接多个目的地的最短封闭路径。飞行员John Doe使用特定策略旅行,从最左侧的目的地开始,向右直至最右侧,再返回起点。文章提供了一段C++代码实现该算法。
238

被折叠的 条评论
为什么被折叠?



