shoot_down @ 2024-07-18 08:04:57
https://www.luogu.com.cn/record/166774095
测试样例
测评机读到 # 号。
本地与 IDE 均正确
#include<bits/stdc++.h>
using namespace std;
/*
用i表示当前枚举到第几行,j表示当前行的状态,k表示上一行的状态
*/
int n,m;
const int N=105;
int f[N][70][70],d[N];
int g[70],s,c[250];
void G(int k){
while(k){
c[s]++;
k-=(k&(-k));
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
string a;
cin>>a;
for(int j=0;j<m;j++) d[i]=(d[i]<<1)+(a[j]=='H');
}
g[++s]=0;
for(int i=1;i<(1<<m);i++){
if(i&(i<<1)||i&(i<<2)||i&(i>>2)||i&(i>>1)) continue;
g[++s]=i;
G(i);
}
for(int i=1;i<=s;i++){
if((g[i]&d[1])==0) f[1][i][0]=c[i];
}
for(int i=1;i<=s;i++){
if((g[i]&d[2])!=0) continue;
for(int j=1;j<=s;j++){
if(((g[i]&g[j])==0)&&((g[j]&d[1])==0)) f[2][i][j]=c[i]+c[j];
}
}
for(int i=3;i<=s;i++){
for(int j=1;j<=s;j++){//当前排
if((g[j]&d[i])!=0) continue;
for(int k=1;k<=s;k++) {//上一排
if(((g[j]&g[k])==0)&&((g[k]&d[i-1])==0)){
for(int k2=1;k2<=s;k2++){//上2排
if(((g[j]&g[k2])==0)&&((g[k]&g[k2])==0)&&((g[k2]&d[i-2])==0)){
f[i][j][k]=max(f[i][j][k],f[i-1][k][k2]+c[j]);
}
}
}
}
}
}
int ans=0;
for(int i=1;i<=s;i++){
for(int j=1;j<=s;j++){
ans=max(ans,f[n][i][j]);
}
}
cout<<ans;
return 0;
}
by chenxi2009 @ 2024-07-18 08:18:17
你这个是undifined behaviour,一般存在于Clane与G的差异中,在本地编译器中加入
-Wall
命令即可检索问题所在
by MYLHF @ 2024-07-18 08:18:39
应该是UB。
by chenxi2009 @ 2024-07-18 08:19:50
建议把line24、line27的++s移到外边去,单开一行再试试
by shoot_down @ 2024-07-18 08:20:30
@MYLHF @chenxi2009 语言选了 PHP,此贴结
by zhang_jun @ 2024-07-18 08:25:26
@shoot_down 哥们,你语言选的PHP