感觉状态压缩是一些题的状态可以用二进制表示,然后用位运算操作,目前只解过几次这种类型的题,可能说的不太准,
下面这段代码是用这里HDOJ5045题的代码改的
http://www.kuangbin.net/archives/2014shanghaionline
题目大意:给一个n*n的矩阵,p[i][j]代表i打死j获得的能量,不能自杀,求最后获得的最大总能量
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; int dp[12][1<<10];//第一维可以压缩掉 bool vis[12][1<<10]; int p[12][12]; int n; int solve(int id,int s){ //if(s == (1<<n)-1)s = 0;//就一轮所以不需要重置 if(vis[id][s])return dp[id][s]; vis[id][s] = true; dp[id][s] = 0; if(id == n)return dp[id][s]; for(int i = 0;i < n;i++){ if(s&(1<<i))continue;//i要被打死 int tmp=0; int tmp2=solve(id+1,s|(1<<i)); for(int j = 0;j < n;j++){ if((~s)&(1<<j))continue;//活着的原子,j打死i tmp=max(tmp,p[j][i]); } dp[id][s] = max(dp[id][s],tmp+tmp2); } return dp[id][s]; } int main() { int T; while(~scanf("%d",&n)){ if(n==0)break; for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) scanf("%d",&p[i][j]); memset(vis,false,sizeof(vis)); printf("%d\n",solve(0,0)); } return 0; }