SRM 607 D1 L1:PalindromicSubstringsDiv1,DP

2014-11-24 08:46:01 · 作者: · 浏览: 0

需要用到概率论中求期望的数学公式:若 随机变量 X = X1 + X2 + ... + Xn,则 E(X) = E(X1) + E(X2) + ... + E(Xn)。

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include
            #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                 
                   using namespace std; #define CHECKTIME() printf(%.2lf , (double)clock() / CLOCKS_PER_SEC) /*************** Program Begin **********************/ double dp[5001][5001]; class PalindromicSubstringsDiv1 { public: double expectedPalindromes(vector 
                  
                    S1, vector 
                   
                     S2) { double res = 0; memset(dp, 0, sizeof(dp)); string S; for (int i = 0; i < S1.size(); i++) { S += S1[i]; } for (int i = 0; i < S2.size(); i++) { S += S2[i]; } int N = S.size(); for (int i = 0; i < N; i++) { dp[i][i] = 1.0; res += 1.0; } for (int len = 2; len <= N; len++) { for (int i = 0; i <= N - len; i++) { int marks = 0; if (S[i] == ' ') { ++marks; } if (S[i + len - 1] == ' ') { ++marks; } if (2 == len) { if (0 == marks && S[i] == S[i + len - 1]) { dp[i][i + len - 1] = 1.0; } else if (0 != marks) { dp[i][i + len - 1] = 1.0 / 26.0; } } else { if (0 == marks && S[i] == S[i + len - 1]) { dp[i][i + len - 1] = dp[i+1][i + len - 2]; } else if (0 != marks) { dp[i][i + len - 1] = (1.0 / 26.0) * dp[i+1][i + len - 2]; } } res += dp[i][i + len - 1]; } } return res; } }; /************** Program End ************************/