Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. size_t N;
  7. size_t K;
  8. size_t len;
  9. size_t ** dp;
  10. size_t * arr;
  11.  
  12. void update(size_t i) {
  13.     size_t left = 2 * i + 1;
  14.     size_t right = 2 * i + 2;
  15.     dp[i][0] = arr[i];
  16.     size_t max = 0;
  17.  
  18.     for (size_t j = 1; j <= K; ++j) {
  19.         for (size_t k = 0; k <= j; ++k) {
  20.             size_t k_rev = j - k;
  21.             size_t left_sum = 0;
  22.             size_t right_sum = 0;
  23.  
  24.             if (k > 0) {
  25.                 left_sum = dp[left][k - 1];
  26.             }
  27.             if (k_rev > 0) {
  28.                 right_sum = dp[right][k_rev - 1];
  29.             }
  30.  
  31.             size_t sum = left_sum + right_sum;
  32.             if (sum > max) {
  33.                 max = sum;
  34.             }
  35.         }
  36.         dp[i][j] = max + arr[i];
  37.     }
  38. }
  39.  
  40.  
  41. int main() {
  42.  
  43.     ios_base::sync_with_stdio(false);
  44.     cin.tie(NULL);
  45.  
  46.     cin >> N;
  47.     len = pow(2, N) - 1;
  48.     arr = new size_t[len];
  49.  
  50.     for (size_t i = 0; i < len; ++i) {
  51.         cin >> arr[i];
  52.     }
  53.  
  54.     cin >> K;
  55.  
  56.     dp = new size_t*[len];
  57.     dp[0] = new size_t[len * (K + 1)];
  58.  
  59.     for (size_t i = 1; i < len; ++i) {
  60.         dp[i] = dp[i - 1] + (K + 1);
  61.     }
  62.  
  63.     for (size_t i = 0; i < len; ++i) {
  64.         for (size_t j = 0; j <= K; ++j) {
  65.             dp[i][j] = 0;
  66.         }
  67.     }
  68.  
  69.     size_t last_lev = pow(2, N - 1);
  70.  
  71.     for (size_t i = 0; i < last_lev; ++i) {
  72.         dp[len - 1 - i][0] = arr[len - 1 - i];
  73.     }
  74.  
  75.     for (int i = len - last_lev - 1; i >= 0; --i) {
  76.         update(i);
  77.     }
  78.  
  79.     cout << dp[0][K];
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement