Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- size_t N;
- size_t K;
- size_t len;
- size_t ** dp;
- size_t * arr;
- void update(size_t i) {
- size_t left = 2 * i + 1;
- size_t right = 2 * i + 2;
- dp[i][0] = arr[i];
- size_t max = 0;
- for (size_t j = 1; j <= K; ++j) {
- for (size_t k = 0; k <= j; ++k) {
- size_t k_rev = j - k;
- size_t left_sum = 0;
- size_t right_sum = 0;
- if (k > 0) {
- left_sum = dp[left][k - 1];
- }
- if (k_rev > 0) {
- right_sum = dp[right][k_rev - 1];
- }
- size_t sum = left_sum + right_sum;
- if (sum > max) {
- max = sum;
- }
- }
- dp[i][j] = max + arr[i];
- }
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cin >> N;
- len = pow(2, N) - 1;
- arr = new size_t[len];
- for (size_t i = 0; i < len; ++i) {
- cin >> arr[i];
- }
- cin >> K;
- dp = new size_t*[len];
- dp[0] = new size_t[len * (K + 1)];
- for (size_t i = 1; i < len; ++i) {
- dp[i] = dp[i - 1] + (K + 1);
- }
- for (size_t i = 0; i < len; ++i) {
- for (size_t j = 0; j <= K; ++j) {
- dp[i][j] = 0;
- }
- }
- size_t last_lev = pow(2, N - 1);
- for (size_t i = 0; i < last_lev; ++i) {
- dp[len - 1 - i][0] = arr[len - 1 - i];
- }
- for (int i = len - last_lev - 1; i >= 0; --i) {
- update(i);
- }
- cout << dp[0][K];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement