hdu 5119 滾動陣列dp

2021-07-09 14:05:35 字數 829 閱讀 9468

題意:

現在乙個人有n個朋友,它的每個朋友都有乙個值,它每次可以選擇一些朋友的值然後將它們異或起來,如果最後的異或和大於等於m的話,那麼這個人就贏了。

問,這個人有幾種贏的方法。

思路:求有幾種方法的題目都可以用dp來思考。dp[i][j]:前i個人異或和為j有幾種方法。由於直接開40個人會mle,所以只能用滾動陣列來代替了。

dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j-a[i]]; 這裡是用到了類似於揹包dp的思想!!

然後就推過去就好了。(但是我不是很會怎麼進行優化到一維的?或者說能否優化到一維的呢?。。。

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef __int64 ll;

typedef unsigned __int64 ull;

#define inf 99999999

#define maxn 50

#define ps 2097151

ll dp[2][ps+10];

ll a[maxn];

int main()

dp[0][0]=1;

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

}ll num=0;

for(int i=m;i<=ps;i++) num+=dp[n%2][i];

printf("case #%d: %i64d\n",jj++,num);

}return 0;

}

hdu 5119 (滾動陣列)

題意 給定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 1...

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 1421 dp 滾動陣列

每個dp 沒個30來分鐘 tm的就寫不出什麼狀態轉移方程 還是太弱了啊 touch me 其實用滾動陣列 就是看你上乙個狀態轉移到當前狀態 與 i 前面多少個有關係 因為這裡需要用到 i 2 i 1那麼其實只要用 i 3就可以了 像上一題 我們只涉及到 i 1那麼只需要 2就可以了 這只是乙個 大致...