#include <bits/stdc++.h>
#define int long long
using namespace std;
int a;
string s;
int lcp[3001][3001];
int nxt[3001][3001];
int dp[3001][3001];
int A,B,C;
int bruh=1e16;
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> a;
cin >> s;
s='#'+s;
cin >> A >> B >> C;
for (int i=a;i>=1;i--){
for (int j=a;j>=1;j--){
lcp[i][j]=(s[i]==s[j])*(lcp[i+1][j+1]+1);
}
}
for (int i=1;i<=a;i++){
for (int j=1;j<=a;j++){
nxt[i][j]=a+1;
dp[i][j]=bruh;
}
}
for (int i=1;i<=a;i++){
dp[i][i]=A;
for (int j=a;j>i;j--){
int len=min(lcp[i][j],j-i);
if (len){
nxt[i][len]=j;
}
nxt[i][j-i]=min(nxt[i][j-i],nxt[i][j-i+1]);
}
}
for (int len=1;len<=a;len++){
for (int i=1;i+len-1<=a;i++){
int j=i+len-1;
dp[i][j]=min({dp[i][j],dp[i+1][j]+A,dp[i][j-1]+A});
int p=nxt[i][len];
int cnt=2;
while (p<=a){
dp[i][p+len-1]=min(dp[i][p+len-1],dp[i][j]+B+C*cnt +(p+len-1-i+1-len*cnt)*A);
p=nxt[p][len];
cnt++;
}
}
}
cout << dp[1][a] << "\n";
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... |