제출 #1333322

#제출 시각아이디문제언어결과실행 시간메모리
1333322nguyenkhangninh99Copy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
484 ms132192 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 2510;
int lcp[maxn][maxn], nxt[maxn][maxn];
string s;
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, a, b, c; cin >> n >> s >> a >> b >> c;

    for(int i = n; i >= 1; i--){
        for(int j = i - 1; j >= 1; j--){
            lcp[i][j] = min(s[i - 1] == s[j - 1] ? lcp[i + 1][j + 1] + 1 : 0, i - j);
            if(!nxt[i][lcp[i][j]]) nxt[i][lcp[i][j]] = j;
        }   
        for(int j = n; j >= 1; j--) nxt[i][j] = max(nxt[i][j], nxt[i][j + 1]);
    }

    vector<vector<int>> dp(n + 2, vector<int>(n + 2, 1e18));
    for(int i = 1; i <= n; i++) dp[i][i] = a;
    for(int len = 1; len <= n; len++){
        for(int i = 1; i + len - 1 <= n; i++){
            int j = i + len - 1;
            dp[i][j] = min({dp[i][j], dp[i + 1][j] + a, dp[i][j - 1] + a});
            for(int k = 1, p = nxt[i][len]; p; k++, p = nxt[p][len]) dp[p][j] = min(dp[p][j], dp[i][j] + b + (k + 1) * c + (j - p + 1 - (k + 1) * len) * a);
        }
    }
    cout << dp[1][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...
#Verdict Execution timeMemoryGrader output
Fetching results...