本人做的第一道状态压缩dp,特贴代码留此纪念: 题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1185 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int states[65]; int dp[65][65][105]; int map[102]; int t; int n,m; int search(int now,int next,int dep) { int M=0; int pao=states[now]|states[next]; if(dp[now][next][dep]!=-1) return dp[now][next][dep]; int num=0; for(int i=0;i<m;i++) if(1<<i&states[now]) num++; if(dep==1) return (dp[now][next][1]=num); for(int i=0;i<t;i++) if(!(states[i]&pao||states[i]&map[dep-2])) M=max(M,search(next,i,dep-1)); return dp[now][next][dep]=M+=num; } int main() { cin>>n>>m; t=0; char c; int Max=1<<m; memset(dp,-1,sizeof(dp)); memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>c; if(c=='H') map[i]+=1<<(j-1); } for(int i=0;i<Max;i++) if(!(i&i<<1||i&i<<2||i&i>>1||i&i>>2)) states[t++]=i; cout<<search(0,0,n+2)<<endl; return 0; }