P4310 絕世好題
阿新 • • 發佈:2022-03-30
傳送門
二進位制思想的線性DP,樸素的(O^2)做法無法通過大資料,考慮二進位制的特殊性。為滿足題意,只要兩個數在二進位制下同一位都為1就可以加入序列。定義狀態dp[ i ]為二進位制第 i 位的最長子序列長度。如果進來的數在 i 位上是1則長度加一併用變數maxn記錄一個數各個位的最大長度,最後用這個最大長度對每個等於1的位更新長度(因為在當前數哪些位上是1,這些位就可以移花接木,共享長度)。maxn需要不斷更新!該題還要多加思考。
#include<iostream> using namespace std; int dp[35], N, ans, maxn, num; intmain(void) { cin >> N; for (int i = 1; i <= N; i++) { cin >> num; maxn = 1; for (int j = 0; j <= 31; j++) if ((1 << j) & num) maxn = max(maxn, dp[j] + 1); for (int j = 0; j <= 31; j++) if((1 << j) & num) dp[j] = max(dp[j], maxn); ans = max(ans, maxn); } cout << ans; return 0; }