Cod sursa(job #1206500)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 10 iulie 2014 11:50:37
Problema Cast Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define NMAX 17
#define INF 0x3f3f3f3f

using namespace std;

int a[NMAX][NMAX], Dp[NMAX][1 << NMAX];
int n, T;

int memo(int x, int Conf){
    if(Dp[x][Conf] != INF)
        return Dp[x][Conf];
    int Ans = Dp[x][Conf];
    if(! (Conf & (Conf - 1))){
        for(int i = 0; i < n; ++i)
            if(Conf & (1 << i))
                return a[x][i];
        return Ans;
    }
    for(int i = 0; i < n; ++i)
        if(Conf & (1 << i)){
            int New_Conf = Conf ^ (1 << i);
            Ans = min(Ans, a[x][i] + memo(x, New_Conf));
            Ans = min(Ans, a[x][i] + memo(i, New_Conf));
            for(int y = (New_Conf & (New_Conf - 1)); y != 0; y = (y - 1) & New_Conf)
                Ans = min(Ans, a[x][i] + max(memo(x, y), memo(i, New_Conf ^ y)));
        }
    return Ans;
}

int main(){
    freopen("cast.in", "r", stdin);
    freopen("cast.out", "w", stdout);
    scanf("%d", &T);
    while(T){
        --T;
        scanf("%d", &n);
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j)
                scanf("%d", &a[i][j]);
        memset(Dp, INF, sizeof(Dp));
        printf("%d\n", memo(0, (((1 << n) - 1) ^ 1)));
    }
    return 0;
}