제출 #1355118

#제출 시각아이디문제언어결과실행 시간메모리
1355118AvianshDeveloper (BOI25_dev)C++20
100 / 100
1906 ms1216 KiB
#include <bits/stdc++.h>

using namespace std;

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    int arr[n];
    for(int &i : arr){
        cin >> i;
    }
    vector<int>mem[2];
    auto fin = [&] (int i){
        mem[i%2].clear();
        mem[i%2].reserve(27);
        for(int j = i-4;j<=i+4;j++){
            if(j>=0&&j<n){
                mem[i%2].push_back(arr[j]);
                mem[i%2].push_back(arr[j]+1);
                mem[i%2].push_back(arr[j]-1);
            }
        }
        sort(mem[i%2].begin(),mem[i%2].end());
        mem[i%2].erase(unique(mem[i%2].begin(),mem[i%2].end()),mem[i%2].end());
    };
    unordered_map<int,array<long long,2>> dp[2];
    fin(0);
    for(int i : mem[0]){
        dp[0][i][0]=dp[0][i][1]=abs(i-arr[0]);
    }
    for(int i = 1;i<n;i++){
        dp[i%2].clear();
        fin(i);
        for(int h : mem[i%2]){
            dp[i%2][h][0]=1e18;
            dp[i%2][h][1]=1e18;;
            for(int H : mem[(i-1)%2]){
                if(H<h){
                    dp[i%2][h][1]=min(dp[i%2][h][1],dp[(i-1)%2][H][0]);
                }
                else if(H>h){
                    dp[i%2][h][0]=min(dp[i%2][h][0],dp[(i-1)%2][H][1]);
                }
                else{
                    dp[i%2][h][0]=min(dp[i%2][h][0],dp[(i-1)%2][H][0]);
                    dp[i%2][h][1]=min(dp[i%2][h][1],dp[(i-1)%2][H][1]);
                }
            }
            dp[i%2][h][0]+=abs(arr[i]-h);
            dp[i%2][h][1]+=abs(arr[i]-h);
        }
    }
    long long ans = 1e18;
    for(int i : mem[(n-1)%2]){
        ans=min({dp[(n-1)%2][i][0],dp[(n-1)%2][i][1],ans});
    }
    cout << ans;
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…