标签:
题意不再说了,就是一个二维的dp,维持取最大值是多少。
2 3 2 1 2 3 3 3 1 2 3
Case #1: 4 Case #2: 2HintIn the ?rst sample, Matt can win by selecting: friend with number 1 and friend with number 2. The xor sum is 3. friend with number 1 and friend with number 3. The xor sum is 2. friend with number 2. The xor sum is 2. friend with number 3. The xor sum is 3. Hence, the answer is 4.
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <map> #include <set> #define eps 1e-9 ///#define M 1000100 ///#define LL __int64 #define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) #define mod 1000000007 using namespace std; const int maxn = 1<<20; inline int read() { char ch; bool flag = false; int a = 0; while(!((((ch = getchar()) >= '0') && (ch <= '9')) || (ch == '-'))); if(ch != '-') { a *= 10; a += ch - '0'; } else { flag = true; } while(((ch = getchar()) >= '0') && (ch <= '9')) { a *= 10; a += ch - '0'; } if(flag) { a = -a; } return a; } void write(int a) { if(a < 0) { putchar('-'); a = -a; } if(a >= 10) { write(a / 10); } putchar(a % 10 + '0'); } LL dp[45][maxn+100]; int num[45]; int main() { int T; cin >>T; int Case = 1; while(T--) { int n, m; n = read(); m = read(); for(int i = 1; i <= n; i++) num[i] = read(); memset(dp, 0, sizeof(dp)); dp[0][0] = 1LL; for(int i = 1; i <= n; i++) { for(int j = 0; j <= maxn-5; j++) { dp[i][j] = max(dp[i][j], dp[i-1][j]+dp[i-1][j^num[i]]); } } LL sum = 0; for(int i = m; i <= maxn-5; i++) sum += dp[n][i]; printf("Case #%d: ", Case++); cout<<sum<<endl; } }
HDU 5119 Happy Matt Friends(简单二维dp)
标签:
原文地址:http://blog.csdn.net/xu12110501127/article/details/42809073