玄学问题,开启O2会出错

P2704 [NOI2001] 炮兵阵地

trailfight @ 2024-10-11 19:28:49

#include<bits/stdc++.h>
using namespace std;
const int N=105, M=60;
int n, m, a[N], status[N][M], len[N], cnt[M], dp[N][M][M], ans;
char ch[M];
void dfs(int h, int s, int l, int num){
    cnt[s]=num;
    if(l>=m) return;
    if(a[h]&(1<<l)){
        status[h][++len[h]]=s|1<<l;
        dfs(h, s|1<<l, l+3, num+1);
    }
    dfs(h, s, l+1, num);
}
int main(){
    scanf("%d%d", &n, &m);
    for(int i=0; i<n; ++i){
        scanf("%s", &ch);
        for(int j=0; j<m; ++j){
            if(ch[j]=='P') a[i]=a[i]|1<<j;
        }
    }
    for(int i=0; i<n; ++i){
        dfs(i, 0, 0, 0);
    }
    for(int i=0; i<=len[0]; ++i){
        dp[0][i][0]=cnt[status[0][i]];
        ans=max(ans, dp[0][i][0]);
    }
    for(int i=1; i<n; ++i){
        for(int j=0; j<=len[i]; ++j){
            for(int k=0; k<=len[i-1]; ++k){
                if(status[i][j]&status[i-1][k]) continue;
                if(i<2){
                    dp[i][j][k]=max(dp[i][j][k], dp[i-1][k][0]+cnt[status[i][j]]);
                    ans=max(ans, dp[i][j][k]);
                }else{
                    for(int l=0; l<=len[i-2]; ++l){
                        if(status[i][j]&status[i-2][l] || status[i-1][k]&status[i-2][l]) continue;
                        dp[i][j][k]=max(dp[i][j][k], dp[i-1][k][l]+cnt[status[i][j]]);
                        ans=max(ans, dp[i][j][k]);
                    }
                }
            }
        }   
    }
    printf("%d\n", ans);
    return 0;
}

by cxgcspyinlangyun @ 2024-10-11 19:30:57

???


by brbrbread @ 2024-10-11 19:32:09

O2优化有可能会改变代码的结构和执行顺序,这可能会影响程序的正确性,特别是在复杂的逻辑处理中。 在某些情况下,O2优化可能会增加空间复杂度,导致内存使用量增加,从而可能引发MLE问题


by xyf007 @ 2024-10-11 19:44:19

@brbrbread 至少在 OI 范围内,O2 优化不会让一个正确的代码出错。AI 收收味。


|