UESTC-878
?
中文題
我是傳送門
?
我們定義dp[i][j][k]為利用前i張牌使兩個(gè)人的分?jǐn)?shù)分別為j和k的方案數(shù)
需要注意的就是數(shù)組的大小而已。一開始沒有想清楚,看到牌的大小不超過100,以為得分也不會超過一百...其實(shí)異或后可能出現(xiàn)得分二進(jìn)制表示為1111111的情況
別忘了初始化。雙方都不拿也是一種情況,dp[0][0][0] = 1。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <vector> 7 #define max(x, y) (x > y ? x : y) 8 #define min(x, y) (x > y ? y : x) 9 #define INF 0x3f3f3f3f 10 #define mod 1000000007 11 #define Yes printf("Yes\n") 12 #define No printf("No\n") 13 typedef long long LL; 14 using namespace std; 15 16 int maxn; 17 int v[20]; 18 int dp[20][200][200]; 19 int n; 20 int main(int argc, const char * argv[]) { 21 scanf("%d", &n); 22 maxn = -INF; 23 for (int i = 1; i <= n; i++) { 24 scanf("%d", &v[i]); 25 maxn = max(maxn, v[i]); 26 } 27 dp[0][0][0] = 1; 28 for (int i = 1; i <= n; i++) { 29 for (int k = 0; k <= 128; k++) { 30 for (int j = 0; j <= 128; j++) { 31 dp[i][k][j] += dp[i - 1][k][j]; 32 dp[i][k ^ v[i]][j] += dp[i - 1][k][j]; 33 dp[i][k][j ^ v[i]] += dp[i - 1][k][j]; 34 } 35 } 36 } 37 LL ans = 0; 38 for (int i = 0; i <= 128; i++) { 39 for (int j = i; j <= 128; j++) { 40 ans += dp[n][i][j]; 41 } 42 } 43 printf("%lld\n", ans); 44 return 0; 45 }?
轉(zhuǎn)載于:https://www.cnblogs.com/xFANx/p/7260030.html
總結(jié)
- 上一篇: A stock
- 下一篇: 【bzoj5037】[Jsoi2014]