제출 #503978

#제출 시각아이디문제언어결과실행 시간메모리
503978qwerasdfzxclVim (BOI13_vim)C++14
100 / 100
44 ms29764 KiB
#include <bits/stdc++.h>

typedef long long ll;
using namespace std;
int dp[70070][12][12], a[70070], on[70070];

int main(){
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n, pt = 1, cnt = 0;
    string s;
    cin >> n >> s;

    for (int i=0;i<n;i++){
        if (s[i]!='e') {a[pt++] = s[i] - 'a' + 1; continue;}
        while(i<n && s[i]=='e') i++, cnt++;
        on[pt] = 1;
        a[pt++] = s[i] - 'a' + 1;
    }

    n = pt - 1;

    //for (int i=1;i<=n;i++) printf("%c", a[i]+'a'-1);
    //printf("\n");
    //for (int i=1;i<=n;i++) printf("%d", on[i]);
    //printf("\n");

    for (int j=1;j<=10;j++){
        for (int k=1;k<=10;k++) dp[1][j][k] = 4;
        dp[1][j][0] = 2;
        dp[1][j][11] = 2;
    }

    for (int i=2;i<=n;i++){
        for (int j=1;j<=10;j++){
            for (int k=1;k<=10;k++){
                dp[i][j][k] = 1e9;
                if (a[i]!=j && a[i]!=k) dp[i][j][k] = min(dp[i][j][k], dp[i-1][j][k] + 1);
                if (a[i]!=j) dp[i][j][k] = min(dp[i][j][k], dp[i-1][j][a[i]] + 3);
                if (a[i]!=k) dp[i][j][k] = min(dp[i][j][k], dp[i-1][a[i]][k] + 3);
                dp[i][j][k] = min(dp[i][j][k], dp[i-1][a[i]][a[i]] + 5);

                if (a[i]!=j) dp[i][j][k] = min(dp[i][j][k], dp[i-1][j][0] + 2);
                dp[i][j][k] = min(dp[i][j][k], dp[i-1][a[i]][0] + 4);
            }
        }

        for (int j=1;j<=10;j++){
            dp[i][j][0] = 1e9;
            if (a[i]!=j && !on[i]) dp[i][j][0] = min(dp[i][j][0], dp[i-1][j][0]);
            dp[i][j][0] = min(dp[i][j][0], dp[i-1][a[i]][0] + 2);

            if (a[i]!=j) dp[i][j][0] = min(dp[i][j][0], dp[i-1][a[i]][j] + 1);
            dp[i][j][0] = min(dp[i][j][0], dp[i-1][a[i]][a[i]] + 3);


            dp[i][j][11] = 1e9;
            if (a[i]!=j) dp[i][j][11] = min(dp[i][j][11], dp[i-1][j][11] + 1);
            dp[i][j][11] = min(dp[i][j][11], dp[i-1][a[i]][11] + 3);

            if (a[i]!=j) dp[i][j][11] = min(dp[i][j][11], dp[i-1][j][0]);
            dp[i][j][11] = min(dp[i][j][11], dp[i-1][a[i]][0] + 2);
        }

        dp[i][11][0] = 1e9;
        if (!on[i]) dp[i][11][0] = min(dp[i][11][0], dp[i-1][11][0]);
        dp[i][11][0] = min(dp[i][11][0], dp[i-1][a[i]][0]);

        dp[i][11][0] = min(dp[i][11][0], dp[i-1][a[i]][11] + 1);
        dp[i][11][0] = min(dp[i][11][0], dp[i-1][a[i]][a[i]] + 2);
    }

    //printf("%d\n", dp[1][4][0]);
    printf("%d\n", dp[n][11][0] + cnt*2);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...