关于转移里的位运算
查看原帖
关于转移里的位运算
1200904
Qiu101029楼主2025/1/20 21:43

我看见很多题解是这样写的

for(int i=1;i<=n;++i){
    int now=1;
    for(int j=0;j<=30;j++){
        if(a[i]&(1<<j)){
            now=max(now,f[j]+1);
        } 
    }
    for(int j=0;j<=30;j++){
        if(a[i]&(1<<j)){
            f[j]=max(f[j],now);
        }
    }
    ans=max(ans,now);
}

但是我是这样写的

for(int i=1;i<=n;i++){
    int x,tmp,maxn=0;scanf("%d",&x);
    tmp=x;
    for(int i=0;tmp;i++){
        if(tmp&1) maxn=max(maxn,dp[i]);
        tmp>>=1;
    }
    for(int i=0;x;i++){
        if(x&1) dp[i]=maxn+1;
        x>>=1;
    }
}
for(int i=0;i<=31;i++) ans=max(ans,dp[i]);

这样写和前一个相比有什么区别(优缺点)?

以及为什么第二个循环里的i不会报错且能正常运行?

2025/1/20 21:43
加载中...