/*******************
* lightoj 1011
* Author: fisty
* Data:2014-10-6
* 状态压缩DP
********************/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 20
int dp[MAX_N][1<<16];
int a[MAX_N][MAX_N];
int n, cnt;
void solve(){
for(int i = 2;i <= n; i++){
for(int S = 1; S <= (1 << n) - 1; S++){
if(dp[i-1][S] > 0){
for(int k = 1; k<= n; k++){
if(S >> k & 1)
continue;
dp[i][S | 1<<k] = max(dp[i][S | 1 << k] , dp[i-1][S] + a[i][k]);
}
}
}
}
printf("Case %d: %d\n", cnt++, dp[n][(1 << n) - 1]);
}
int main(){
int t;
cnt = 1;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n;j++){
scanf("%d",&a[i][j]);
}
}
memset(dp, 0, sizeof(dp));
for(int i = 1;i <= n ; i++)
dp[1][1 << (n - i)] = a[1][i];
solve();
}
return 0;
}
lightoj 1011
最新推荐文章于 2017-08-22 20:59:05 发布