旅行,紫书P269UVa1347(DP)

来源:互联网 发布:stringbuffer拼接json 编辑:程序博客网 时间:2024/05/21 09:00

这道题其实能用动态规划,主要由于两点:
1.节点是按x大小给出并编号的。
2.最短路径一定包含1-2遍。或者说最短路的走法一定是优先编号小的点先走,需要做的决策是哪个人走这个点而已。
所以本题才可以用dp求解。

// UVa1347 Tour// Rujia Liu#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int maxn = 50 + 5;double x[maxn], y[maxn], dist[maxn][maxn], d[maxn][maxn];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++)        dist[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));    for(int i = n-1; i >= 2; i--)      for(int j = 1; j < i; j++) {        if(i == n-1) d[i][j] = dist[i][n] + dist[j][n]; // 杈圭晫        else d[i][j] = min(dist[i][i+1] + d[i+1][j], dist[j][i+1] + d[i+1][i]);      }    printf("%.8lf\n", dist[1][2] + d[2][1]);  }  return 0;}