Submission #1161306

#TimeUsernameProblemLanguageResultExecution timeMemory
1161306brintonGroup Photo (JOI21_ho_t3)C++20
44 / 100
5094 ms2884 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> isReverse;
int getReverse(int l,int r){
    int ret = 0;
    for(int i = l;i <= r;i++){
        for(int j = i+1;j <= r;j++){
            if(isReverse[i][j]){
                // if isReverse, we don't reverse it,subtract1
                ret--;
            }else{
                // else cost add
                ret++;
            }
        }
    }
    return ret;
}
int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N;
    cin >> N;
    vector<int> v(N+1);
    vector<int> loc(N+1);
    for(int i = 1;i <= N;i++){
        cin >> v[i];
        loc[v[i]] = i;
    }
    isReverse = vector<vector<int>>(N+1,vector<int>(N+1,0));
    int total = 0;
    for(int i = 1;i <= N;i++){
        for(int j = i+1;j <= N;j++){
            if(loc[i] > loc[j]){
                isReverse[i][j] = 1;
                total++;
            } 
        }
    }
    vector<int> dp(N+1,0);
    dp[0] = 0;
    for(int i = 1;i <= N;i++){
        // chose a range to reverse
        for(int j = i;j >= 1;j--){
            int cost = getReverse(j,i);
            // cout << j << " "
            dp[i] = min(dp[i],dp[j-1]+cost);
        }
    }
    // for(int i = 1;i <= N;i++)cout << loc[i] << " ";cout << endl;
    // for(int i = 1;i <= N;i++)cout << dp[i] << " ";cout << endl;
    // cout << total << endl;
    cout << total+dp[N];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...