SRM 595 D2 L3:LittleElephantAndXor, dp

2014-11-24 08:50:47 · 作者: · 浏览: 0

题目:http://community.topcoder.com/stat c=problem_statement&pm=12623&rd=15707

参考:http://apps.topcoder.com/wiki/display/tc/SRM+595

关于位运算的题目应当考虑 逐位 进行dp.

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
            #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                 
                   using namespace std; #define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC) /*************** Program Begin **********************/ long long dp[31][2][2][2]; vector 
                  
                    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 ************************/