我不得不吐槽下这题,第一,这题的数据真的很弱,状压DP,20*17000*17000 居然不超时。第二,C++交RE,G++才行导致我贡献了无限次RE。
状压水题,代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 20000;
int dp[25][maxn];
int Map[22][22];
int hash[maxn];
int getsum(int now,int n,int temp){
int sum=0;
for(int i=0;i<n;i++){
if((temp>>i) & 1){
sum+= Map[now][i];
}
}
return sum;
}
int main(){
int n;
// printf("~~~~maxn=%d",maxn);
while(~scanf("%d",&n)){
//printf("%d\n",maxn);
if(n==0) {printf("0\n");continue;}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&Map[i][j]);
int num=0;
int Max=(1<<n)-1;
for(int i=0;i<=Max;i++){
if(!(i&(i<<1))){
hash[num++]=i;
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<num;j++){
int tmp_j=hash[j];
int sum=getsum(i,n,tmp_j);
if(!i) dp[i][j]=sum;
else{
for(int k=0;k<num;k++){
int tmp_k=hash[k];
if( !(tmp_k & tmp_j) ){
dp[i][j]=max(dp[i][j],dp[i-1][k]+sum);
}
}
}
}
}
int ans=-1;
for(int i=0;i<num;i++){
ans=max(ans,dp[n-1][i]);
}
printf("%d\n",ans);
}
return 0;
}