用vecotr<int> a[61]来存每一行符合单行要求的编号。
bool map[i][j]用来表示编号i和编号j能否在一条直线上
<span style="font-size:12px;">#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; struct node { int num,val; }v[61]; int s[11],cnt=0,n,m; int dp[101][61][61]; vector<int> a[101]; bool map[61][61]; void dfs(int lie,int value,int ge) { v[++cnt].val=value; v[cnt].num=ge; if(lie>10) return; for(int i=lie;i<=10;i++) dfs(i+3,value+s[i],ge+1); } bool cmp(node x,node y) { return x.val<y.val; } int main() { int i,j,now,pre,ppre,k,ans=0; char ch[12]; for(s[1]=1,i=2;i<=10;i++) s[i]=s[i-1]<<1; dfs(1,0,0); sort(v+1,v+cnt+1,cmp); scanf("%d%d",&n,&m); getchar(); //for(i=0;i<=n;i++) a[i].clear(); a[0].push_back(1); for(i=1;i<=n;i++) { gets(ch+1); k=0; for(j=1;j<=m;j++) if(ch[j]=='P') k+=s[j]; for(j=1;j<=cnt;j++) if(k>=v[j].val) { if((k&v[j].val)==v[j].val) a[i].push_back(j); } else break; } //memset(map,false,sizeof(map)); map[1][1]=1; for(i=1;i<=cnt;i++) for(j=i+1;j<=cnt;j++) if((v[i].val&v[j].val)==0) map[i][j]=map[j][i]=true; // memset(dp,0,sizeof(dp)); for(now=0;now<a[1].size();now++) dp[1][a[1][now]][1]=v[a[1][now]].num; for(i=2;i<=n;i++) for(now=0;now<a[i].size();now++) for(pre=0;pre<a[i-1].size();pre++) if(map[a[i][now]][a[i-1][pre]]) for(ppre=0;ppre<a[i-2].size();ppre++) if(map[a[i][now]][a[i-2][ppre]]&&map[a[i-1][pre]][a[i-2][ppre]]) dp[i][a[i][now]][a[i-1][pre]]=max(dp[i][a[i][now]][a[i-1][pre]],dp[i-1][a[i-1][pre]][a[i-2][ppre]]+v[a[i][now]].num); for(i=0;i<a[n].size();i++) for(j=0;j<a[n-1].size();j++) ans=max(ans,dp[n][a[n][i]][a[n-1][j]]); printf("%d\n",ans); }</span>