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>
using namespace std;
const int MAX_N = 2500;
long long dp[MAX_N][MAX_N];
int main() {
int n, a, b, c;
string s;
cin >> n >> s >> a >> b >> c;
for ( int i = 0; i < n; i++ )
dp[i][i] = a;
for ( int len = 2; len <= n; len++ ) {
for ( int l = 0; l <= n - len; l++ ) {
int r = l + len - 1;
dp[l][r] = min( dp[l][r - 1], dp[l + 1][r] ) + a;
for ( int d = 1; d * d <= len; d++ ) {
if ( len % d == 0 ) {
bool ok;
ok = true;
for ( int i = l; i <= r - d; i++ )
ok &= (s[i] == s[i + d]);
if ( ok )
dp[l][r] = min( dp[l][r], dp[l][l + d - 1] + b + (long long)c * (len / d) );
d = len / d;
ok = true;
for ( int i = l; i <= r - d; i++ )
ok &= (s[i] == s[i + d]);
if ( ok )
dp[l][r] = min( dp[l][r], dp[l][l + d - 1] + b + (long long)c * (len / d) );
d = len / d;
}
}
}
}
long long ans = LONG_LONG_MAX;
for ( int l = 0; l < n; l++ ) {
for ( int r = l; r < n; r++ )
ans = min( ans, dp[l][r] + (long long)a * (n - (r - l + 1)) );
}
cout << ans;
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... |