hdu 1565 方格取数(1)

来源:互联网 发布:excel 数据连接 编辑:程序博客网 时间:2024/05/21 10:24

状态压缩》》》》》》》》》》》》》》》》》》》》》》》》

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#include<queue>
#include<iostream>
#define inf 999999999


using namespace std;


int Min( int a,int b )
{
return a>b?b:a;
}


int n, m, k;
int dp[22][20000];
int map[30][30];
int num[20000];


int main()
{
int i, j, t, sum, countt, maxx, falg, cas=0;


k=0;
for( i=0;i<( 1<<20 );i++ )
{
if( ( i&( i<<1 ) )==0 )
num[k++]=i;
}


while( scanf( "%d",&n )!=-1 )
{
for( i=1;i<=n;i++ )
{
for( j=0;j<n;j++ )
scanf( "%d",&map[i][j]  );
}

memset( dp,0,sizeof( dp ) );


for( k=1;k<=n;k++ )
{
for( i=0;num[i]<( 1<<n );i++ )
{
sum=0;
maxx=0;
for( j=0;j<n;j++ )
{
if( ( num[i]&( 1<<j )) )
sum+=map[k][j];
}


for( j=0;num[j]<( 1<<n );j++ )
{
if( ( num[j]&num[i] )==0 )
{
if( dp[k-1][j]>maxx )
maxx=dp[k-1][j];
}
}
dp[k][i]=maxx+sum;
}
}


maxx=0;
for( i=0;num[i]<( 1<<n );i++ )
{
if( dp[n][i]>maxx )
maxx=dp[n][i];
}
printf( "%d\n",maxx );
}
return 0;
}

0 0
原创粉丝点击