int minimumPalidrome(string s) {
   if (s.size() <= 1)
     return 0;
   vector<vector<int> > dp(s.size(), vector<int>(s.size(), 0));
   for (int i = 0; i<s.size()-1; i++) {
     dp[i][i+1] = s[i]==s[i+1]? 0 : 1;
   }
   for (int len = 3; len <= s.size(); len++) {
     for (int i = 0; i+len <= s.size(); i++) {
       if (s[i] == s[i+len-1])
           dp[i][i+len-1] = dp[i+1][i+len-2];
       else {
           dp[i][i+len-1] = 1 + minThree(dp[i+1][i+len-2], dp[i][i+len-2], dp[i+1][i+len-1]);
       }
     }
   }
   return dp[0][s.size()-1];
 }
 int maxProduct(int A[], int n) {
     if (!A) {
         return 0;
     }
     int lMinPrev = 1;
     int lMaxPrev = 1;
     int lMax = INT_MIN;
     int curProduct = 1;
     for (int i = 0; i< n; ++i) {
         
         curProduct  = maxThree(lMinPrev*A[i], lMaxPrev*A[i], A[i]);
         lMinPrev = minThree(lMinPrev*A[i], lMaxPrev*A[i], A[i]);
         lMaxPrev = curProduct;
         
         if (curProduct > lMax) {
             lMax = curProduct;
         }
     }
     
     return lMax;
 }