HDU1565+状态压缩dp

时间:2020-12-12 23:34:01

简单的压缩状态

dp

 /*
状态压缩dp
同hdu2167
利用滚动数组!!
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
using namespace std;
const int maxn = ;
int binary[ maxn+ ];
int s[ <<(maxn) ];
//int sum[ maxn ][ 1<<maxn ];
//int dp[ maxn ][ 1<<maxn ];
int dp[][<<maxn];
int mat[ maxn ][ maxn ];
void init_binary(){
binary[] = ;
for( int i=;i<=;i++ ){
binary[i] = *binary[i-];
}
} int solve( int n ){
//memset( sum,0,sizeof( sum ) );
memset( dp,,sizeof( dp ) );
int cnt = ;
int N = (<<n);
for( int i=;i<N;i++ ){
if( ( (i<<)&i )== ){
s[ cnt++ ] = i;
}
}//保存合格的状态
//for( int i=0;i<n;i++ ){
//for( int j=0;j<cnt;j++ ){
//for( int k=0;k<n;k++ ){
//if( binary[k]&s[j] ){
//sum[ i ][ j ] += mat[ i ][ k ];
//}
//}
//}
//}
int ans = ;
for( int i=;i<cnt;i++ ){
int sum = ;
for( int j=;j<n;j++ ){
if( binary[j]&s[i] ){
sum += mat[][j];
}
}
dp[][i] = sum;
ans = max( ans,dp[][i] );
}
for( int i=;i<n;i++ ){
for( int j=;j<cnt;j++ ){
for( int k=;k<cnt;k++ ){
if( ( s[j]&s[k] )== ){
int sum = ;
for( int kk=;kk<n;kk++ ){
if( binary[kk]&s[j] ){
sum += mat[i][kk];
}
}
if( i%== ) dp[ ][ j ] = max( dp[][j],dp[][k]+sum );
else dp[ ][ j ] = max( dp[][j],dp[][k]+sum );
//dp[ i ][ j ] = max( dp[i][j],dp[i-1][k]+sum );
//dp[i][j] = max( dp[i][j],dp[i-1][k]+sum[i][j] );
}
}
ans = max( ans,max( dp[][j],dp[][j] ) );
}
}
return ans;
} int main(){
int n;
init_binary();
while( scanf("%d",&n)== ){
for( int i=;i<n;i++ ){
for( int j=;j<n;j++ ){
scanf("%d",&mat[i][j]);
}
}
int ans = solve( n );
printf("%d\n",ans);
}
return ;
}