BZOJ P4300: 绝世好题

    xiaoxiao2021-03-25  108

    用f[i]表示上一次第i位为1时的最大子序列长度

    然后直接DP

    读入了一个x那么我们把x的每一位为1的所对应的的f[i]都拿出来进行比较

    然后做更新

    #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int n,f[32],x; int a[100010]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; int now=0; for(int j=0;j<=30;j++){ if(a[i]&(1<<j)){ now=max(f[j]+1,now); } } for(int j=0;j<=30;j++){ if(a[i]&(1<<j)){ f[j]=now; } } } int ans=-1; for(int i=0;i<=31;i++){ ans=max(ans,f[i]); } cout<<ans<<endl; return 0; } /* in: 3 1 2 3 out: 2 */

    转载请注明原文地址: https://ju.6miu.com/read-24380.html

    最新回复(0)