我看见很多题解是这样写的
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
不会报错且能正常运行?