diff --git a/3562. Maximum Profit from Trading Stocks with Discounts b/3562. Maximum Profit from Trading Stocks with Discounts new file mode 100644 index 0000000..9048ec7 --- /dev/null +++ b/3562. Maximum Profit from Trading Stocks with Discounts @@ -0,0 +1,91 @@ +class Solution { +public: + int maxProfit(int n, vector& present, vector& future, vector>& hierarchy, int budget) { + vector> tree(n); + vector in_degree(n, 0); + for (auto &e : hierarchy) { + int u = e[0] - 1; + int v = e[1] - 1; + tree[u].push_back(v); + in_degree[v]++; + } + int root = 0; + for (int i = 0; i < n; i++) { + if (in_degree[i] == 0) { + root = i; + break; + } + } + const long long INF = -(long long)1e15; + vector capability(n, 0); + function cap = [&](int u) -> long long { + long long s = present[u]; + for (int v : tree[u]) s += cap(v); + capability[u] = (int)min(budget, s); + return s; + }; + cap(root); + + vector> dp0(n), dp1(n); + + auto merge = [&](const vector& a, const vector& b) -> vector { + int len_a = (int)a.size() - 1; + int len_b = (int)b.size() - 1; + int total = min(budget, len_a + len_b); + + vector c(total + 1, INF); + + for (int i = 0; i <= min(len_a, total); i++) { + long long ai = a[i]; + if (ai == INF) + continue; + int maxj = min(len_b, total - i); + for (int j = 0; j <= maxj; j++) { + long long bj = b[j]; + if (bj == INF) + continue; + long long val = ai + bj; + if (val > c[i + j]) c[i + j] = val; + } + } + return c; + }; + + function dfs = [&](int u) { + for (int v : tree[u]) + dfs(v); + + vector skip(capability[u] + 1, INF); + vector base(capability[u] + 1, INF); + skip[0] = 0; + base[0] = 0; + + for (int v : tree[u]) { + skip = merge(skip, dp0[v]); + base = merge(base, dp1[v]); + } + + auto comp = [&](int parentBought) -> vector { + int price = parentBought ? (present[u] / 2) : present[u]; + long long profit = (long long)future[u] - price; + vector maximize = skip; + if (price <= capability[u]) { + for (int b = price; b <= capability[u]; b++) { + if (base[b - price] != INF) { + long long can = base[b - price] + profit; + if (can > maximize[b]) + maximize[b] = can; + } + } + } + return maximize; + }; + + dp0[u] = comp(0); + dp1[u] = comp(1); + }; + + dfs(root); + return *max_element(dp0[root].begin(), dp0[root].end()); + } +};