light_searcher @ 2023-12-16 07:21:37
不开O2:一片绿
开O2:五彩斑斓
有没有大佬帮我看看咋了qwq
#include<bits/stdc++.h>
using namespace std;
const int N=105,M=15,K=66;
int n,m,g[K],c[K],cnt,h[M],f[N][K][K],ans;
char s[N][M];
int count(int x){
int ans=0;
while(x){
if(x&1) ans++;
x>>=1;
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
for(int j=1;j<=m;j++)
h[i]=(h[i]<<1)+(s[i][j]=='H'?1:0);
}
for(int i=0;i<(1<<m);i++)
if(!(i&(i<<1))&&!(i&(i<<2))){
g[++cnt]=i;
c[cnt]=count(i);
if(!(g[cnt]&h[1]))
f[1][cnt][0]=c[cnt];
}
if(n==1){
for(int i=1;i<=cnt;i++)
if(!(g[i]&h[n]))
ans=max(ans,f[n][i][0]);
printf("%d",ans);
return 0;
}
for(int i=1;i<=cnt;i++){
if(g[i]&h[2]) continue;
for(int j=1;j<=cnt;j++){
if((g[j]&g[i])||(g[j]&h[1])) continue;
f[2][i][j]=f[1][j][0]+c[i];
}
}
for(int i=3;i<=n;i++)
for(int j=1;j<=cnt;j++){
if(g[j]&h[i]) continue;
for(int k=1;k<=cnt;k++){
if((g[j]&g[k])||(g[k]&h[i-1])) continue;
for(int t=1;t<=cnt;t++){
if((g[j]&g[t])||(g[k]&g[t])||(g[t]&h[i-2])) continue;
f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+c[j]);
}
}
}
for(int i=1;i<=cnt;i++)
for(int j=1;j<=cnt;j++)
if(!(g[i]&g[j])&&!(g[i]&h[n])&&!(g[j]&h[n-1]))
ans=max(ans,f[n][i][j]);
printf("%d",ans);
return 0;
}
by ran_qwq @ 2023-12-16 07:56:18
UB。
by light_searcher @ 2023-12-16 08:57:36
@ran_qwq 可不可以帮我修改一下
by ran_qwq @ 2023-12-16 09:05:59
为什么K是66?
by light_searcher @ 2023-12-16 09:44:42
@ran_qwq 一行里满足要求的方案数最多是61个,所以随便开了66
by light_searcher @ 2023-12-16 09:47:25
@ran_qwq
for(int i=0;i<(1<<10);i++)
if(!(i&(i<<1))&&!(i&(i<<2)))
cnt++;
像这样测出来的
by light_searcher @ 2023-12-16 09:51:40
@light_searcher 哦60个
by UUSamuel @ 2024-05-17 18:39:11
GOOD
by Ender_stove @ 2024-07-18 22:05:53
@UUSamuel 你个傻逼