Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions:1621 | Accepted: 487 |
Description
Input
Output
Sample Input
2 2 10 10 9000 10 3 14 23 0 0 14 0 1000 9500 14
Sample Output
Scenario #1: You have officially been pimped for only $30 Scenario #2: You have officially been pimped for only $42
#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#define rep(x,y) for(int i=x;i<=y;i++)
#define repp(x,y,m,n) rep(x,m)rep(y,n)
typedef long long ll;
int n;
int a[15][15];
int dp[16400];
void check(int e,int z,int x){
int y=0;
int w=1;
for(int i=1;i<=n;i++){
if((x&w)!=0){
y+=a[z][i];
}
w<<=1;
}
if(dp[x]==-1){
dp[x]=y+e;
}
else{
dp[x]=min(dp[x],y+e);
}
}
void solve(){
int N;
scanf("%d",&N);
for(int k=1;k<=N;k++){
memset(dp,-1,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
queue<int> que;
int x=1;
for(int i=1;i<=n;i++){
check(0,i,x);
que.push(x);
x<<=1;
}
while(!que.empty()){
int t=que.front();
que.pop();
int w=1;
for(int i=1;i<=n;i++){
if((w&t)==0){
if(dp[t+w]==-1){
que.push(t+w);
}
check(dp[t],i,t+w);
}
w<<=1;
}
}
printf("Scenario #%d:\nYou have officially been pimped for only $%d\n\n",k,dp[(1<<n)-1]);
}
return;
}
int main(){
solve();
return 0;
}