题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837
思路:状态压缩+记忆化搜索。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define FILL(a,b) memset(a,b,sizeof(a)) int dp[<<],map[][];
int n; int dfs(int state,int m)
{
if(state==)return ;
if(dp[state])return dp[state];
for(int i=;i<n;i++){
if(state&(<<i)){
dp[state]=max(dp[state],dfs(state&~(<<i),m-)+map[i][m]);
}
}
return dp[state];
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d",&n);
for(int i=;i<n;i++)
for(int j=;j<n;j++)scanf("%d",&map[i][j]);
FILL(dp,);
printf("Case %d: %d\n",t++,dfs((<<n)-,n-));
}
return ;
}