答えの上限を大まかに見積もっておく。上限の値が出たら、終了。
入力によっては、少しも早くならない気がする・・・。
というか、ACが出たことに驚いた。
実行速度ランキング6位。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
const int TIME = 420;
int cost[N];
int g[N][N];
int result;
int lim;
void rec(int pos, int vis, int time, int size, int depth)
{
if( TIME < time )return ;
result = max( result, depth );
if( result == lim )return ;
for(int i=0; i<size; ++i){
if( vis & (1 << i) ) continue;
int spend = g[pos][i] + cost[i];
rec(i, vis | (1 << i), time + spend, size, depth + 1);
if( result == lim ) return ;
}
return ;
}
void wf(int size)
{
for(int k=0; k<size; ++k){
for(int i=0; i<size; ++i){
for(int j=0; j<size; ++j){
g[i][j] = min( g[i][j], g[i][k] + g[k][j] );
}
}
}
return ;
}
int main(void)
{
int n;
while( cin >> n && n ){
for(int i=0; i<n; ++i){
cin >> cost[i];
}
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
cin >> g[i][j];
}
}
wf(n);
static int c[N];
copy( cost, cost + n, c );
int mx = 0;
for(int i=0; i<n; ++i){
int mn = 1 << 24;
for(int j=0; j<n; ++j){
if( i != j ) mn = min(mn, g[i][j]);
}
mx = max(mx, mn);
c[i] += mn;
}
sort( c, c + n );
lim = 0;
for(int i=0, sum = -mx; i < n && sum + c[i] <= TIME; lim = ++i){
sum += c[i];
}
result = 0;
for(int i=0; i<n; ++i){
rec(i, (1 << i), cost[i], n, 1);
}
cout << result << endl;
}
return 0;
}
0 件のコメント :
コメントを投稿