过了本地oj,欢欢喜喜过来刷蓝题,结果100分,最后一个点爆零,只有一行的话不管有几列他只输出零求助
#include<bits/stdc++.h>
using namespace std;
long long n,m,f[120][1010][1010],st[10000],td[10000],top,mod=100000000,ans,num[100000];//f[][][],第一维当前行,第二维当前状态,第三维上一行状态
bool check(int x){
if((x&(x<<1))&&(x&(x>>1)))return 0;
if((x&(x<<2))&&(x&(x>>2)))return 0;
else return 1;
}
bool find(int x,int y){
if(x&td[y])return 0;
else return 1;
}
long count(long i){
int c=0;
while(i>0)
{
++c;
i-=i&(-i);
}
return c;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++){
td[i]=0;
char t;
for(int j=1;j<=n;j++){
cin>>t;
if(t=='H'){
td[i]+=(1<<(n-j));
}
}
}
for(int i=0;i<(1<<n);i++){
if(check(i))st[++top]=i;
}
for(int j=1;j<=top;j++){
num[j]=count(st[j]);
if(find(st[j],1)){
f[1][j][0]=num[j];
}
}
for(int i=1;i<=top;i++)
{
for(int j=1;j<=top;j++)
{
if(!find(st[i],1))continue;
if(st[i]&st[j])continue;
if(!find(st[j],2))continue;
f[2][j][i]=max(f[2][j][i],f[1][i][0]+num[j]);
}
}
for(int i=3;i<=m;i++){
for(int j=1;j<=top;j++){
if(!find(st[j],i))continue;
for(int k=1;k<=top;k++){
if(!find(st[k],i-1))continue;
if(st[j]&st[k])continue;
for(int t=1;t<=top;t++){
if(!find(st[t],i-2))continue;
if(((st[j]&st[t])==0)&&((st[t]&st[k])==0))
f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+num[j]);
}
}
}
}
for(int i=1;i<=top;i++){
for(int j=1;j<=top;j++){
ans=max(ans,f[m][i][j]);
}
}
cout<<ans;
return 0;
}