首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 5119 Happy Matt Friends:XOR 子集計數 DP(滾動數組優化)

     編輯:關於C++

問題描述

給定 n≤50 個數 a_i (≤2^20),查詢有多少非空子集的異或和 > m。多測試用例。

DP 狀態定義

dp[i][x] = 前 i 個數中,異或和為 x 的子集數。
轉移:
dp[i][x] = dp[i-1][x] + dp[i-1][x ^ a_i]
(不選 a_i + 選 a_i)。

滾動數組優化空間

只依賴上一行,用 dp[2][1<<20] 交替。
初始 dp[0][0] = 1(空集)。

代碼實現


const int MAXX = 1<<20;
long long dp[2][MAXX];

int main() {
    int T; scanf("%d",&T);
    while (T--) {
        int n, m; scanf("%d%d",&n,&m);
        memset(dp, 0, sizeof dp);
        dp[0][0] = 1;
        for (int i=1;i<=n;++i) {
            int a; scanf("%d",&a);
            int cur = i&1, pre = cur^1;
            for (int x=0;x

複雜度

時間 O(n * 2^20) ≈ 50 * 1e6 = 5e7,C++ 優化後約 0.5-1s。
空間 2 * 2^20 * 8B ≈ 16 MB。

優化技巧

  • 用 int 存儲計數(模數題),或 long long 無模數。
  • 內層循環展開、指針訪問加速。
  • 若 m 較大,可反向統計 ≤m 再用總數相減(總數 = 2^n - 1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved