#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 5e5+5;
const ll MOD = 1e9+7;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second
int n, nxt[2505][2505];
string s;
ll dp[2505][2505], A, B, C;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> s >> A >> B >> C;
vector<vector<int>> group(1);
for(int i = 0; i < n; i++)
group[0].pb(i);
for(int len = 0; len < n; len++) {
vector<vector<int>> at_group;
for(int G = 0; G < sz(group); G++) {
vector<int> letter[26];
for(int i : group[G])
if(i + len < n) letter[s[i + len] - 'a'].pb(i);
for(int l = 0; l < 26; l++)
if(!letter[l].empty()) at_group.pb(letter[l]);
}
group = at_group;
for(int G = 0; G < sz(group); G++) {
if(sz(group[G]) == 1) continue;
for(int i = 0, j = 0; i < sz(group[G]); i++) {
while(j < sz(group[G]) and group[G][j] <= group[G][i] + len) j++;
if(j == sz(group[G])) break;
nxt[group[G][i]][group[G][i] + len] = group[G][j] + len;
}
}
}
// set dp
for(int i = 0; i < n; i++)
for(int j = i; j < n; j++)
dp[i][j] = A*(j-i+1);
// calcular dp
for(int len = 0; len < n; len++) {
for(int i = 0, j = len; j < n; i++, j++) {
if(len) dp[i][j] = min({dp[i][j], dp[i+1][j] + A, dp[i][j-1] + A});
// vamos olhar para as dps que podem ser formadas usando (i, j)
for(int k = nxt[i][j], cnt = 2; k != 0; k = nxt[k - len][k], cnt++)
dp[i][k] = min(dp[i][k], dp[i][j] + B + cnt*C + (k-i+1 - cnt*len - cnt)*A);
}
}
cout << dp[0][n-1];
}
# | 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... |