제출 #1364887

#제출 시각아이디문제언어결과실행 시간메모리
1364887njoopK개의 묶음 (IZhO14_blocks)C++20
100 / 100
149 ms82432 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, k;
    cin >> n >> k;
    vector<int> arr(n+2, 0);
    vector<vector<int>> dp(k+2, vector<int>(n+2, 1e18));
    dp[0][0] = 0;
    for(int i=1; i<=n; i++) cin >> arr[i];
    for(int i=1; i<=k; i++) {
        stack<tuple<int, int, int>> s;
        int mn = 0;
        dp[i][i] = dp[i-1][i-1] + arr[i];
        s.push({i, arr[i], dp[i][i]});
        for(int j=i+1; j<=n; j++) {
            dp[i][j] = min(dp[i][j], dp[i-1][j-1] + arr[j]);
            while(!s.empty() && arr[j] > get<1>(s.top())) {
                dp[i][j] = min(dp[i][j], dp[i][get<0>(s.top())] + arr[j] - get<1>(s.top()));
                s.pop();
            }
            if(!s.empty()) {
                dp[i][j] = min(dp[i][j], dp[i][get<0>(s.top())]);
            } 
            s.push({j, arr[j], dp[i][j]});
        }
    }
    cout << dp[k][n];
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…