P4310-绝世好题【位运算,dp】
生活随笔
收集整理的這篇文章主要介紹了
P4310-绝世好题【位运算,dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problem/P4310
題目大意
一個長度為nnn的序列,求一個最長的子序列使得每個數&\&&前一個數不為0。
解題思路
因為是&\&&不為0,所以只要有一位都為1即可。
用fif_ifi?表示以第iii個結尾的最長子序列長度,然后ziz_izi?表示枚舉到現在為止第iii位為111的最大的fif_ifi?。然后枚舉位數即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=101000; int n,f[N],z[35],ans; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);for(int j=0;j<=30;j++)if(x&(1<<j)) f[i]=max(f[i],z[j]+1);for(int j=0;j<=30;j++)if(x&(1<<j)) z[j]=max(z[j],f[i]);ans=max(ans,f[i]);}printf("%d",ans); }總結
以上是生活随笔為你收集整理的P4310-绝世好题【位运算,dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辨别路由器的性能好坏路由器怎么区分性能好
- 下一篇: 电脑键盘失灵怎么解决台式电脑键盘失灵怎么