loj 1011(状态压缩+记忆化搜索)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837

思路:状态压缩+记忆化搜索。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 using namespace std;

 6 #define FILL(a,b) memset(a,b,sizeof(a))

 7 

 8 int dp[1<<17],map[17][17];

 9 int n;

10 

11 int dfs(int state,int m)

12 {

13     if(state==0)return 0;

14     if(dp[state])return dp[state];

15     for(int i=0;i<n;i++){

16         if(state&(1<<i)){

17             dp[state]=max(dp[state],dfs(state&~(1<<i),m-1)+map[i][m]);

18         }

19     }

20     return dp[state];

21 }

22 

23 int main()

24 {

25     int _case,t=1;

26     scanf("%d",&_case);

27     while(_case--){

28         scanf("%d",&n);

29         for(int i=0;i<n;i++)

30             for(int j=0;j<n;j++)scanf("%d",&map[i][j]);

31         FILL(dp,0);

32         printf("Case %d: %d\n",t++,dfs((1<<n)-1,n-1));

33     }

34     return 0;

35 }
View Code

 

你可能感兴趣的:(压缩)