#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int minPartitionScore(vector<int>& a, int k)
{
int n = a.size();
vector<vector<ll>> dp(n + 1, vector<ll>(k + 1, 1e17));
dp[n][0] = 0;
for(int w = 1; w <= k; ++w)
{
stack<vector<ll>> st{};// stores (max in range, min value dp[range][w - 1], min value of max(a[i + 1 + j]) + dp[j][w - 1])
for(int i = n - 1; i >= 0; --i)
{
ll mn = dp[i + 1][w - 1];
while(!st.empty() && st.top()[0] <= a[i])
{
mn = min(mn, st.top()[1]);
st.pop();
}
ll y = min(a[i] + mn, st.empty() ? (ll) 1e17 : st.top()[2]);// update the minimum, this is the value we need after adjustments
st.push({a[i], mn, y});
dp[i][w] = y;
}
}
return dp[0][k];
}
signed main()
{
vector<int> a{2, 5, 4, 3, 7, 1, 6, 8};
cout<<minPartitionScore(a, 3)<<"\n";
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmludCBtaW5QYXJ0aXRpb25TY29yZSh2ZWN0b3I8aW50PiYgYSwgaW50IGspCnsKICAgIGludCBuID0gYS5zaXplKCk7CiAgICB2ZWN0b3I8dmVjdG9yPGxsPj4gZHAobiArIDEsIHZlY3RvcjxsbD4oayArIDEsIDFlMTcpKTsKCiAgICBkcFtuXVswXSA9IDA7CgogICAgZm9yKGludCB3ID0gMTsgdyA8PSBrOyArK3cpCiAgICB7CiAgICAgICAgc3RhY2s8dmVjdG9yPGxsPj4gc3R7fTsvLyBzdG9yZXMgKG1heCBpbiByYW5nZSwgbWluIHZhbHVlIGRwW3JhbmdlXVt3IC0gMV0sIG1pbiB2YWx1ZSBvZiBtYXgoYVtpICsgMSArIGpdKSArIGRwW2pdW3cgLSAxXSkKICAgICAgICBmb3IoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpCiAgICAgICAgewogICAgICAgICAgICBsbCBtbiA9IGRwW2kgKyAxXVt3IC0gMV07CiAgICAgICAgICAgIHdoaWxlKCFzdC5lbXB0eSgpICYmIHN0LnRvcCgpWzBdIDw9IGFbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1uID0gbWluKG1uLCBzdC50b3AoKVsxXSk7CiAgICAgICAgICAgICAgICBzdC5wb3AoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGwgeSA9IG1pbihhW2ldICsgbW4sIHN0LmVtcHR5KCkgPyAobGwpIDFlMTcgOiBzdC50b3AoKVsyXSk7Ly8gdXBkYXRlIHRoZSBtaW5pbXVtLCB0aGlzIGlzIHRoZSB2YWx1ZSB3ZSBuZWVkIGFmdGVyIGFkanVzdG1lbnRzCiAgICAgICAgICAgIHN0LnB1c2goe2FbaV0sIG1uLCB5fSk7CiAgICAgICAgICAgIGRwW2ldW3ddID0geTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRwWzBdW2tdOwp9CgoKc2lnbmVkIG1haW4oKQp7CgogICAgdmVjdG9yPGludD4gYXsyLCA1LCA0LCAzLCA3LCAxLCA2LCA4fTsKCiAgICBjb3V0PDxtaW5QYXJ0aXRpb25TY29yZShhLCAzKTw8IlxuIjsKfQoK