求助

P2704 [NOI2001] 炮兵阵地

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]才对。感谢好人!!!


|