Cod sursa(job #1874912)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 10 februarie 2017 16:01:34
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 17
#define INF 2000000000

using namespace std;

struct poz {
    int x , y ;
};

poz cr [ N ] , old[ N ] ;
int distold [ N ];
int dp [ 1 << ( N + 1 ) ][ N ];
int predist  [ N ][ N ];


int n , nold ;

int dist ( poz a , poz b ){
    return ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y );
}

void solve (){
    static int i , j , k , vmax ;

    for ( i = 0 ; i < ( 1 << ( n + 1 ) ) ; i++  ){
        for ( j = 0 ; j <= n ; j ++ ){
            dp [ i ][ j ] = INF ;
        }
    }

    for ( i = 0 ; i <= nold ; i++ ){
        for ( j = 0 ; j <= n ; j ++ ){
            dp [ 1 << j ][ j ] = min( dp [ 1 << j ][ j ] , distold [ i ] + dist ( cr [ j ] , old [ i ] ) );
        }
    }

    for ( i = 0 ; i <= n ; i ++ ){
        for ( j = 0 ; j <= n ; j++ ){
            predist [ i ][ j ] = dist( cr [ i ] , cr [ j ] );
        }
    }

    for ( i = 1 ; i < ( 1 << ( n + 1 ) ) - 1 ; i ++ ){
        for ( j = 0 ; j <= n ; j ++ ){

            // j e punctul pe care urmeaza sa il calculam folosindu-ne de k

            if ( ( 1 << j ) & i ){
                continue ;
            }

            for ( k = 0 ; k <= n ; k ++ ){

                if ( ! ( ( 1<<k ) & i )  ){
                    continue ;
                }

                if ( k == j ){
                    continue ;
                }

                dp [ i + (1<<j) ][ j ] = min ( dp [ i + ( 1<<j ) ][ j ] ,  dp [ i ][ k ] + predist [ k ][ j ] );

            }
        }
    }

    vmax = INF ;
    for ( i = 0 ; i <= n ; i++ ){
        vmax = min( vmax , dp [ (1<<( n + 1 ) ) - 1 ][ i ] );
        distold [ i ] = dp [ (1<<( n + 1 ) ) - 1 ][ i ] ;
        old [ i ] = cr [ i ] ;
    }
    nold = n ;
    n = 0;
    printf("%d\n",vmax);
}

int main(){
    int type ;

    freopen("bibel.in","r",stdin);
    freopen("bibel.out","w",stdout);

    nold = 1;

    while ( 3 ){

        scanf("%d",&type );

        if ( type == 1 ){
            n--;
            solve ();
            continue;
        }else if ( type == 2 ){
            return 0 ;
        }

        scanf("%d%d",&cr [ n ].x , &cr [ n ].y );
        n++ ;

    }

    return 0;
}