和点击打开链接这题很像,跑了2.8s,不知道那些0ms的怎么跑出来的,●rz
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[2][1<<20], prestatu;
int num[22][22], N;
int now, nowi;
void DFS( int statu, int pos, int sum ){
if( pos > N ){
return;
}
dp[now][statu] = max( dp[now][statu], sum );
DFS( statu, pos + 1, sum );
int flag = 1;
if( pos > 1 ){
if( statu & ( 1 << ( pos - 2 ) ) ){
flag = 0;
}
}
if( prestatu & ( 1 << ( pos - 1 ) ) ){
flag = 0;
}
if( flag ){
dp[now][statu|(1<<(pos-1))] = max( dp[now][statu|(1<<(pos-1))], sum + num[nowi][pos] );
DFS( statu|(1<<(pos-1)), pos + 1, sum + num[nowi][pos] );
}
}
int main(){
while( scanf( "%d", &N ) != EOF ){
memset( dp, -1, sizeof( dp ) );
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= N; j++ ){
scanf( "%d", &num[i][j] );
}
}
dp[0][0] = 0;
now = 1;
for( int i = 1; i <= N; i++ ){
memset( dp[now], -1, ( 1 << 20 ) * sizeof( int ) );
nowi = i;
for( int j = 0; j < ( 1 << N ); j++ ){
if( dp[now^1][j] != -1 ){
prestatu = j;
DFS( 0, 1, dp[now^1][j] );
}
}
now ^= 1;
}
int ans = 0;
for( int i = 0; i < ( 1 << N ); i++ ){
ans = max( ans, dp[now^1][i] );
}
cout << ans << endl;
}
return 0;
}