P9523
先 orz oyds。但是为什么没有 oyds 的简单预处理做法啊。
区间 dp。
以及最基本的:
这部分复杂度为
现在就要考虑怎么找这个
这部分
简单好写。
code:
点击查看代码
int n,m,lcp[N][N],pre[N][N];
ll A,B,C,dp[N][N];
char s[N];
void Yorushika(){
scanf("%d%s%lld%lld%lld",&n,s+1,&A,&B,&C);
drep(i,n,1){
drep(j,i-1,1){
lcp[i][j]=s[i]==s[j]?lcp[i+1][j+1]+1:0;
lcp[i][j]=min(lcp[i][j],i-j);
if(!pre[i][lcp[i][j]])
pre[i][lcp[i][j]]=j;
}
drep(j,n,1){
pre[i][j]=max(pre[i][j],pre[i][j+1]);
}
}
mems(dp,0x3f);
rep(i,1,n){dp[i][i]=A;}
rep(len,1,n){
rep(i,1,n-len+1){
int j=i+len-1;
dp[i][j]=min({dp[i][j],dp[i+1][j]+A,dp[i][j-1]+A});
int p=i;
rep(k,1,j/len){
p=pre[p][len];
if(!p)break;
dp[p][j]=min(dp[p][j],dp[i][j]+B+(k+1)*C+(j-p+1-(k+1)*len)*A);
}
}
}
printf("%lld\n",dp[1][n]);
}
signed main(){
int t=1;
// scanf("%d",&t);
while(t--)
Yorushika();
}