csu1527: Bounty Hunter

来源:互联网 发布:淘宝客不计入销量 编辑:程序博客网 时间:2024/05/18 00:01

Time Limit:5000MS     Memory Limit:131072KB    64bit IO Format:%lld & %llu

SubmitStatus Practice CSU 1527

Description

Input

Output

Sample Input

250 11 22 03 24 13100 1200 1300 1

Sample Output

9.300563079746400


从0到n-1走过去再走回来经过所有点保证走过的路程最短


假设来回的两条路各自经过的点中,除了0跟n-1外还有其它点是它们都有的,那么显然把这个点单独放在两条路中的一条都会更加好


所以两条路的点必然只有0,n-1两个交集


dp[i][j]:一条路以0,i为两个端点,另一条路以0,j为两个端点,且包括0跟max(i,j)中的所有点时的最短路程,由于上述原则,必然i,j要有一个大一些,我们设i>j


#include<map>#include<string>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<queue>#include<vector>#include<iostream>#include<algorithm>#include<bitset>#include<climits>#include<list>#include<iomanip>#include<stack>#include<set>using namespace std;struct point{double x,y;double dis(point one){returnsqrt(pow(x-one.x,2)+pow(y-one.y,2));}friend istream & operator >>(istream &is,point &one){is>>one.x>>one.y;return is;}};point box[600];double dp[600][600];int main(){int T;cin>>T;while(T--){int n;cin>>n;for(int i=0;i<n;i++)cin>>box[i];dp[1][0]=box[0].dis(box[1]);for(int i=1;i<n-2;i++){dp[i+1][i]=1e99;for(int j=0;j<i;j++){dp[i+1][i]=min(dp[i+1][i],dp[i][j]+box[j].dis(box[i+1]));dp[i+1][j]=dp[i][j]+box[i].dis(box[i+1]);}}double ans=n==2?2.0*box[0].dis(box[1]):1e99;for(int i=0;i<n-2;i++)ans=min(ans,dp[n-2][i]+box[n-2].dis(box[n-1])+box[i].dis(box[n-1]));printf("%.9f\n",ans);}}

0 0
原创粉丝点击