3
int get_max(vector<int> &arr, int s, int e) {4
int mx_val = *max_element(arr.begin() + s, arr.begin() + e + 1);5
return (e - s + 1) * mx_val;8
int solve(vector<int> &arr, int idx, int k, vector<vector<int>> &dp) {9
if (idx >= arr.size()) return 0;11
if (dp[idx][k] != -1) return dp[idx][k];15
for (int i = 0; i < k; ++i) {16
if ((idx + i) > arr.size() - 1) break;18
int val = get_max(arr, idx, idx + i) + solve(arr, idx + i + 1, k, dp);21
return dp[idx][k] = ans;24
int maxSumAfterPartitioning(vector<int> &arr, int k) {25
vector<vector<int>> dp(arr.size() + 1, vector<int>(k + 1, -1));27
return solve(arr, 0, k, dp);