沒什麼好說的,狀壓dp模板題
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=25;
const int dep=18000;
int n;
int map[MAXN][MAXN];
int dp[MAXN][dep];
int p[dep];
int cnt;
void init()
{
cnt=0;
for(int i=0;i<(1<<n);i++)
if(!(i&(i<<1)))
p[cnt++]=i;
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
memset(dp,0,sizeof(dp));
init();
for(int i=1;i<=n;i++)
{
for(int j=0;j<cnt;j++)
{
int ans=0;
for(int k=0;k<n;k++)
if(p[j]&(1<<k))
ans+=map[i][k+1];
for(int k=0;k<cnt;k++)
if(!(p[k]&p[j]))
dp[i][j]=max(dp[i][j],dp[i-1][k]+ans);
}
}
int ans=0;
for(int i=0;i<cnt;i++)
ans=max(ans,dp[n][i]);
cout<<ans<<endl;
}
return 0;
}