제출 #1156922

#제출 시각아이디문제언어결과실행 시간메모리
1156922PacybwoahGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
389 ms766724 KiB
#include<iostream>
#include<algorithm>
#include<utility>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
int dp[405][405][405][3];
const int inf = 1e9;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    string s;
    cin >> s;
    vector<vector<int>> cols(3, vector<int>(1)), pre(n + 1, vector<int>(3));
    int sr = 0, sg = 0, sb = 0;
    for(int i = 0; i < n; i++){
        pre[i + 1][0] = pre[i][0];
        pre[i + 1][1] = pre[i][1];
        pre[i + 1][2] = pre[i][2];
        if(s[i] == 'R'){
            cols[0].push_back(i + 1);
            sr++;
            pre[i + 1][0]++;
        }
        else if(s[i] == 'G'){
            cols[1].push_back(i + 1);
            sg++;
            pre[i + 1][1]++;
        }
        else{
            cols[2].push_back(i + 1);
            sb++;
            pre[i + 1][2]++;
        }
    }
    for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) for(int k = 0; k <= n; k++) for(int l = 0; l < 3; l++) dp[i][j][k][l] = inf;
    dp[0][0][0][0] = 0;
    dp[0][0][0][1] = 0;
    dp[0][0][0][2] = 0;
    auto mabs = [&](int x){
        return max(x, 0);
    };
    for(int i = 1; i <= n; i++){
        for(int cr = 0; cr <= sr; cr++){
            for(int cg = 0; cg <= sg; cg++){
                for(int col = 0; col < 3; col++){
                    if(i - cr - cg < 0 || i - cr - cg > sb) continue;
                    if(cr == 0 && col == 0) continue;
                    if(cg == 0 && col == 1) continue;
                    if(i - cr - cg == 0 && col == 2) continue;
                    int cost, cb = i - cr - cg;
                    if(col == 0) cost = mabs(pre[cols[0][cr]][1] - cg) + mabs(pre[cols[0][cr]][2] - cb);
                    else if(col == 1) cost = mabs(pre[cols[1][cg]][0] - cr) + mabs(pre[cols[1][cg]][2] - cb);
                    else cost = mabs(pre[cols[2][cb]][0] - cr) + mabs(pre[cols[2][cb]][1] - cg);
                    int dpc = inf;
                    for(int k = 0; k < 3; k++){
                        if(k != col){
                            if(col == 0) dpc = min(dpc, dp[i - 1][cr - 1][cg][k] + cost);
                            else if(col == 1) dpc = min(dpc, dp[i - 1][cr][cg - 1][k] + cost);
                            else dpc = min(dpc, dp[i - 1][cr][cg][k] + cost);
                        }
                    }
                    dp[i][cr][cg][col] = dpc;
                }
            }
        }
    }
    int ans = inf;
    for(int i = 0; i < 3; i++) ans = min(ans, dp[n][sr][sg][i]);
    if(ans == inf) cout << "-1\n";
    else cout << ans << "\n";
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run pC.cpp
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...