BZOJ 2734 集合選數(狀態壓縮DP)

2021-09-07 23:11:56 字數 522 閱讀 9439

題意:給出乙個由1到n的數字組成的集合。定義合法子集為若x在子集中則2x、3x均不能在子集中。求有多少個合法的子集。

思路:1   3    9

2   6    18

4   12   36

對於上面的矩陣,我們發現就等價於不選相鄰數字的方案數。因此列舉每個還沒有用到的數字,建立以該數字為左上角的矩陣。接著就是狀態壓縮dp。

int a[n][n];

i64 f[2][1<<12];

int n,r,c,h[100005];

void init(int x)

}int set0(int st,int k)

i64 dp()

else

}swap(pre,cur);

}i64 ans=0;

for0(i,m) up(ans,f[pre][i]);

return ans;

}int main()

pr(ans);

}

bzoj 2734 集合選數

構造矩陣 1 3 9 27 2 6 18 54 4 12 36 108 每個數是上面的數乘2,左面的數乘3。這樣進行狀壓dp就是相鄰的格仔不能選的方案數。如何判斷乙個二進位制數沒有兩個連續的1?x x 1 0 如果有的數沒有出現過,就以它為左上角元素再構造乙個矩陣。這是怎麼想到的?include i...

BZOJ2734 集合選數

集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n 100000,如何求出 的滿足上述約束條件的子集的個數 只需輸出對 1,000,...

bzoj 2734 集合選數

written with stackedit.集合論與圖論 這門課程有一道作業題,要求同學們求出 的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n leq 100000 如何求出 ...