제출 #1206710

#제출 시각아이디문제언어결과실행 시간메모리
1206710pinbuCopy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
299 ms98496 KiB
// https://codeforces.com/blog/entry/101003?#comment-897398 // https://oj.uz/submission/1096892 #include <bits/stdc++.h> using namespace std; const int N = 2505; const long long oo = 1e18; template<class T> void mini(T &X, T Y) { if (X > Y) X = Y; } int n; long long A, B, C; string s; int LCP[N][N], nxt[N][N]; long long dp[N][N]; signed main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> s; s = ' ' + s; cin >> A >> B >> C; for (int i = n; i; i--) { for (int j = n; j; j--) { LCP[i][j] = (s[i] == s[j]) * (LCP[i + 1][j + 1] + 1); nxt[i][j] = n + 1; dp[i][j] = oo; } } for (int i = 1; i <= n; i++) { dp[i][i] = A; for (int j = n; j > i; j--) { int len = min(LCP[i][j], j - i); if (len) { mini(nxt[i][len], j); } mini(nxt[i][j - i], nxt[i][j - i + 1]); } } // finding out how to compute nxt is quite hard... for (int len = 1; len <= n; len++) { for (int l = 1; l <= n - len + 1; l++) { int r = l + len - 1; mini(dp[l][r], min(dp[l][r - 1], dp[l + 1][r]) + A); int p = nxt[l][len], num = 2; while (p <= n) { mini(dp[l][p + len - 1], dp[l][r] + B + num * C + (p + len - l - num * len) * A); p = nxt[p][len]; num++; } } } cout << dp[1][n]; return 0; }
#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...