tangzirui1016 @ 2025-01-10 20:49:23
#include<bits/stdc++.h>
using namespace std;
int n,m,x[105],s[1<<10],num[1<<10],cnt,dp[2][1<<10][1<<10];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
char a;
cin>>a;
if(a=='H') x[i]+=1<<(m-j-1);
}
}
for(int i=0;i<1<<m;i++){
if(!(i&i>>1)&&!(i&i>>2)){
s[++cnt]=i;
for(int j=0; j<m; j++)
num[i]+=(i>>j&1);
}
}
for(int i=1;i<=n+2;i++){
for(int a=1;a<=cnt;a++){
for(int b=1;b<=cnt;b++){
for(int c=1;c<=cnt;c++){
if((s[a]&x[i])==s[a]&&(s[b]&x[i-1])==s[b]&&!(s[a]&s[b])&&!(s[b]&s[c])&&!(s[a]&s[c]))
dp[i&1][a][b]=max(dp[i&1][a][b],dp[i-1&1][b][c]+num[s[a]]);
}
}
}
}
cout<<dp[n+2&1][0][0];
return 0;
}
不知道为什么总是输出0?
by _saltFish_ @ 2025-01-10 20:53:59
@tangzirui1016 据我所知,位运算的优先级低得离谱,甚至比大于、小于号的优先级还低(到底是谁想出的这么离谱的设计)。建议在合适的地方加上括号。比如 for(int i=0;i<1<<m;i++){
。
by tangzirui1016 @ 2025-01-10 20:57:46
@saltFish 调了,但还是错的……
by _saltFish_ @ 2025-01-10 21:00:36
@tangzirui1016 最后结束要在 dp[n+2&1][i][j]
中取最大值吧
by _saltFish_ @ 2025-01-10 21:00:54
就是求答案的时候
by tangzirui1016 @ 2025-01-10 21:04:02
你可以看一下 这篇题解
by tangzirui1016 @ 2025-01-10 21:04:13
@saltFish
by _saltFish_ @ 2025-01-10 21:21:29
@tangzirui1016 调出来了,把各种括号加上,然后输出 dp[(n+2)&1][1][1]
by tangzirui1016 @ 2025-01-10 21:42:21
@saltFish 虽然过了,但有个疑问:为什么最后是dp[(n+2)&1][1][1]
呢?
by tangzirui1016 @ 2025-01-10 21:47:51
@saltFish 问题解决了,我的dp后两个表示的是下标,我的是从1开始,所以应该是输出dp[n+2&1][1][1]
才对。感谢好人!!!