JustinRochester @ 2018-05-29 13:25:14
别的点都没挂掉,竟然第一个点挂掉了2333
我自己也查不出错,本地评测没有问题,洛谷上就多了1......
求大犇帮忙看一下,真心绝望
#include<cstdio>
using namespace std;
#define max(a,b) ((a>b)?a:b)
int n,m,map[101]={0},alw[60],calw[60],cntalw=0,dp[101][1024][1024]={0};
inline int count(int s){
int ans=0;
while(s>0) ans+=(s&1),s>>=1;
return ans;
}
inline void pre(){
scanf("%d %d",&n,&m);
for(int l=1;l<=n;l++){
getchar();
for(int c=0;c<m;c++) map[l]<<=1,map[l]+=(getchar()=='H')?1:0;
}
for(register int s=0;s<(1<<m);s++) if(!((s&(s<<1))|(s&(s<<2))))
alw[cntalw]=s,calw[cntalw]=count(s),cntalw++;
}
inline int ans(){
for(int l=1;l<=n;l++)
for(int i=0;i<cntalw;i++) if(!(alw[i]&map[l]))
for(int j=0;j<cntalw;j++) if(!(alw[i]&alw[j]))
for(int k=0;k<cntalw;k++) if(!((alw[i]&alw[k])|(alw[j]&alw[k])))
dp[l][i][j]=max(dp[l][i][j],dp[l-1][j][k]+calw[i]);
int maxp=0;
for(int i=0;i<cntalw;i++) if(!(alw[i]&map[n]))
for(int j=0;j<cntalw;j++) if(!(alw[i]&alw[j]))
maxp=max(maxp,dp[n][i][j]);
return maxp;
}
int main(){
pre();
printf("%d",ans());
return 0;
}
by 子秋 @ 2018-07-21 10:12:22
读取的时候不要用getchar,直接读字符串然后处理