Advertisement
BoxerTC

UVA 12800

Nov 12th, 2014
444
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define N 200
  13. #define INF (1e10)
  14.  
  15. typedef vector< int > vi;
  16. typedef long double ld;
  17.  
  18. struct Point{
  19.     ld x ,y;
  20.     Point(){ x = y = 0;}
  21.     Point( ld x , ld y ) : x( x ) , y( y ) {}
  22.     ld dist(){ return hypot( x , y );}
  23. };
  24.  
  25. Point operator - ( const Point &A , const Point &B ){ return Point( A.x - B.x , A.y - B.y );}
  26. Point operator + ( const Point &A , const Point &B ){ return Point( A.x + B.x , A.y + B.y );}
  27. ld dist( const Point &A , const Point &B ){ return (B - A).dist();}
  28. Point P[ N + 5 ];
  29. bool used[ N + 5 ][ N + 5 ];
  30. ld memo[ N + 5 ][ N + 5 ];
  31. int n;
  32. ld Dist( int a , int b ){
  33.     if( (a + 1)%n == b ) return 0;
  34.     return dist( P[ a ] , P[ b ] );
  35. }
  36. ld dp( int lo , int hi ){
  37.     if( (lo + 3)%n == hi ) return 0;
  38.     if( (lo + 2)%n == hi ) return 0;
  39.     if( (lo + 1)%n == hi ) return 0;
  40.     if( (lo + 0)%n == hi ) return 0;
  41.     if( used[ lo ][ hi ] ) return memo[ lo ][ hi ];
  42.     used[ lo ][ hi ] = 1;
  43.     ld &dev = memo[ lo ][ hi ] = INF;
  44.     for( int i = (lo + 1)%n ; i != hi ; i = (i + 2)%n )
  45.         for( int j = (i + 1)%n ; j != (hi + 1)%n ; j = (j + 2)%n ){
  46.             dev = min( dev , Dist( lo , i ) + Dist( i , j ) + Dist( j , hi ) + dp( lo , i ) + dp( i , j ) + dp( j , hi ) );
  47.         }
  48.     return dev;
  49. }
  50. int main(){
  51.     while( sc( n ) == 1 ){
  52.         n *= 2;
  53.         REP( i , n ){
  54.             double x , y;
  55.             scanf( "%lf%lf" , &x , &y );
  56.             P[ i ] = Point( x , y );
  57.         }
  58.         clr( used , 0 );
  59.         printf( "%.4f\n" , (double) dp( 0 , n - 1 ) );
  60.     }  
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement