UVa1347 Tour

来源:互联网 发布:nginx重启命令 编辑:程序博客网 时间:2024/05/22 09:05

        看着紫书的分析才下的手。。想象成两个人以不同的路从起点走到终点。dp(i,j)表示1~max(i,j)全部走过,两人位置分别是i和j,还需要走多长的距离。规定i>j,i和j不特指某一个人,指的是当前在前面和后面的人。


#include <iostream>    #include <stdio.h>    #include <cmath>    #include <algorithm>    #include <iomanip>    #include <cstdlib>    #include <string>    #include <memory.h>    #include <vector>    #include <queue>    #include <stack>    #include <map>  #include <set>  #include <ctype.h>    #define INF 1000000  #define ll long long  using namespace std;  struct point{int x;int y;};point pt[100];int n;double dp[100][100];double dist2(point p1,point p2){return sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}double fun(int i,int j){if(dp[i][j]>0)return dp[i][j];if(i==n){dp[i][j]=dist2(pt[j],pt[n]);return dp[i][j];}double re=min(fun(i+1,j)+dist2(pt[i],pt[i+1]),fun(i+1,i)+dist2(pt[j],pt[i+1]));dp[i][j]=re;return re;}int main(){while(cin>>n){for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)dp[i][j]=-1.0;for(int i=1;i<=n;i++){cin>>pt[i].x>>pt[i].y;}printf("%.2lf\n",fun(1,1));}return 0;}


0 0
原创粉丝点击