This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define cerr if(false)cerr
const ll MAX_N = 2510;
ll n, a, b, c;
string str;
ll dp[MAX_N][MAX_N][2];
ll solve(ll l, ll r, bool clip) {
if(!clip) { return (r - l + 1) * a; }
if(dp[l][r][clip] != -1) { return dp[l][r][clip]; }
if(l == r) { return a; }
ll &ans = dp[l][r][clip];
ans = (r - l + 1) * a;
ans = min(ans, solve(l + 1, r, true) + a);
ans = min(ans, solve(l + 1, r, false) + a);
cerr << "----------------------" << endl;
for(ll len = 1; len <= (r - l + 1); len ++) {
string now = str.substr(l, len);
ll pos = l;
ll total = solve(l, l + len - 1, true) + b;
cerr << "Starting " << total << endl;
while(pos <= r) {
if(pos + len - 1 <= r && str.substr(pos, len) == now) {
pos += len;
total += c;
cerr << "p";
} else {
pos ++;
total += a;
cerr << "w";
}
}
total += max(0ll, r - pos + 1) * a;
ans = min(ans, total);
cerr << " For llerval " << l << " " << r
<< " " << len << " " << total << endl;
}
cerr << l << " " << r << " " << str.substr(l, r - l + 1) << " "
<< clip << " " << ans << endl;
return ans;
}
signed main() {
cin >> n >> str >> a >> b >> c;
for(ll i = 0; i < n; i ++) {
for(ll j = 0; j < n; j ++) {
dp[i][j][0] = dp[i][j][1] = -1;
}
}
cout << solve(0, n - 1, true) << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |