题目:http://community.topcoder.com/stat?c=problem_statement&pm=12623&rd=15707
参考:http://apps.topcoder.com/wiki/display/tc/SRM+595
关于位运算的题目应当考虑 逐位 进行dp.
代码:
#include <algorithm> #include <iostream> #include <sstream> #include <string> #include <vector> #include <stack> #include <deque> #include <queue> #include <set> #include <map> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <cstring> #include <ctime> using namespace std; #define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC) /*************** Program Begin **********************/ long long dp[31][2][2][2]; vector <int> dA, dB, dC; class LittleElephantAndXor { public: long long rec(int t, int eqA, int eqB, int eqC) { if (t == -1) { return 1; } long long & res = dp[t][eqA][eqB][eqC]; if (res != -1) { return res; } res = 0; for (int a = 0; a <= 1; a++) { for (int b = 0; b <= 1; b++) { int eqA2, eqB2, eqC2; if (eqA == 1) { if (a > dA[t]) { continue; } else if (a == dA[t]) { eqA2 = 1; } else { eqA2 = 0; } } else { eqA2 = 0; } if (eqB == 1) { if (b > dB[t]) { continue; } else if (b == dB[t]) { eqB2 = 1; } else { eqB2 = 0; } } else { eqB2 = 0; } int c = a ^ b; if (eqC == 1) { if (c > dC[t]) { continue; } else if (c == dC[t]) { eqC2 = 1; } else { eqC2 = 0; } } else { eqC2 = 0; } res += rec(t - 1, eqA2, eqB2, eqC2); } } return res; } long long getNumber(int A, int B, int C) { long long res = 0; memset(dp, -1, sizeof(dp)); dA.clear(); dB.clear(); dC.clear(); for (int i = 0; i < 31; i++) { dA.push_back(A & 1); dB.push_back(B & 1); dC.push_back(C & 1); A >>= 1; B >>= 1; C >>= 1; } res = rec(30, 1, 1, 1); return res; } }; /************** Program End ************************/
SRM 595 D2 L3:LittleElephantAndXor, dp
原文:http://blog.csdn.net/xzz_hust/article/details/19052105