显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,k,a[30][30],prz[30];
char s[100010];
ll sum[30][100010],f[100010];
int main(){
freopen("cowmbat.in","r",stdin);
freopen("cowmbat.out","w",stdout);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
scanf("%lld %lld %lld",&n,&m,&k);
scanf("%s",s+1);
for (int i=0;i<m;++i)
for (int j=0;j<m;++j)
scanf("%lld",&a[i][j]);
for (int k=0;k<m;k++)
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
if (i!=j&&i!=k&&j!=k)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
for (int i=0;i<m;i++)
for (int j=1;j<=n;j++)
sum[i][j]=a[s[j]-'a'][i]+sum[i][j-1];
memset (prz,0x3f,sizeof(prz));
memset (f,0x3f,sizeof(f));
f[0]=0;
for (int i=k;i<=n;i++)
for (int j=0;j<m;j++){
prz[j]=min(prz[j]+a[s[i]-'a'][j],f[i-k]+sum[j][i]-sum[j][i-k]);
f[i]=min(f[i],prz[j]);
}
printf("%lld",f[n]);
return 0;
}