hdu 5119 (滾動陣列)

2021-10-08 15:09:15 字數 1444 閱讀 1836

題意:給定n

nn個數k

ik_i

ki​,從中選取任意個(可以為0

00)進行異或得到ans

ansan

s,問有多少種ans

≥m

ans\geq m

ans≥m。

資料範圍:1≤n

≤40,0

≤ki≤

106,

m≤10

61\leq n \leq 40, 0\leq k_i\leq 10^6,m\leq 10^6

1≤n≤40

,0≤k

i​≤1

06,m

≤106

題解:

f [i

][j]

f[i][j]

f[i][j

]表示選前i

ii個數得到異或結果為j

jj的數量,狀態轉移為為f[i

][j]

=f[i

−1][

j]+f

[i−1

][j∧

ki

]f[i][j]=f[i-1][j]+f[i-1][j \wedge k_i]

f[i][j

]=f[

i−1]

[j]+

f[i−

1][j

∧ki​

]由於只與前乙個狀態有關,所以仍然可以用模2

22來進行當前狀態和上一狀態的區分。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

inline

intread()

while

(ch >=

'0'&& ch <=

'9')

return x * f;

}const

int n =40+

10, m =

1<<20;

int f[2]

[m];

long

long

solve()

long

long res =

1ll<< n;

for(

int j =

0; j < m;

++j) res -

= f[n &1]

[j];

return res;

}int

main()

return0;

}

hdu 5119 滾動陣列dp

題意 現在乙個人有n個朋友,它的每個朋友都有乙個值,它每次可以選擇一些朋友的值然後將它們異或起來,如果最後的異或和大於等於m的話,那麼這個人就贏了。問,這個人有幾種贏的方法。思路 求有幾種方法的題目都可以用dp來思考。dp i j 前i個人異或和為j有幾種方法。由於直接開40個人會mle,所以只能用...

hdu 5119 和》 m情況數 dp

給一n元數列,求異或和 m的情況數 dp i j 表示由前i個數組成異或和為j的方法數,每次先獲得不異或當前b i 的情況數,加上異或了b i 的情況數即可。dp 0 0 1,其他為0 5s險過.include include include include include include incl...

hdu 1024 滾動陣列優化

本題的大致意思為給定乙個陣列,求其分成 m個不相交子段和最大值的問題。解題思路 dp i j 表示前j個數分成i組,且j在第i組裡的最大值。dp i j max,前乙個表示j與j 1在i組裡,後乙個表示j單獨成組。但這道題的n很大,空間複雜度太高,所以要用滾動陣列。max dp i 1 k 就是上一...