P4310 絕世好題 題解

2022-01-10 17:58:12 字數 706 閱讀 5329

第一次看這道題首先想到的就是時間複雜度為\(\ n^\)的求最長上公升子串行

for(int i=1;i<=n;i++)\),這樣寫會超時

所以我們考慮更優秀的演算法,突破口就是位運算

題目中的操作是按位與,所以我們可以把乙個數的每乙個二進位制位分別拆分進行計算

我們設\(f[i]\)為當前二進位制位為\(i\)時滿足要求的最長長度

我們用乙個變數\(k\)記錄當前位置的最大狀態

要注意的是,最大狀態要在所有為\(1\)的位中轉移

比如下面這組資料

在轉移到第二位的時候要取乙個最大值

最後不要忘了用這個值去更新\(f\)值

#includeusing namespace std;

const int maxn=1e5+10;

int n,a[maxn],ans;

int f[300];

int main()

for(int i=1;i<=n;++i)

} for(int j=0;j<=30;j++)

} ans=max(ans,now);

} printf("%d\n",ans);

return 0;

}

P4310 絕世好題

給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 輸入格式 輸入檔案共2行。第一行包括乙個整數n。第二行包括n個整數,第i個整數表示ai。輸出格式 輸出檔案共一行。包括乙個整數,表示子串行bi的最長長度。輸入樣例 1 3 1 2 3 輸出樣例 1 2 ...

P4310 絕世好題

題目描述 給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 說明對於100 的資料,1 n 100000,ai 10 9。錯誤日誌 沒搞清 每一位的dp值如何更新記錄陣列 乙個數 a 可以接在數 b 後面,當他們在二進位制下有相同位同為 1 時成立 這...

P4310 絕世好題 DP 題解

題面傳送門 p4310 絕世好題 第一眼以為是套路n2 dp,一看資料範圍1e5,直接懵逼5min 其實挺簡單的,題目也不錯 仔細想想挺簡單的,因為b i b i 1 0,那至少有一位二進位制位b i 和b i 1 均為1。然後我們考慮列舉bi的每一位二進位制1,在所有這一位也為1的數中,取以該數結...