用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>