rt,感觉已经改得和第一篇题解一模一样了还是不对,求大佬帮帮QAQ!
#include<cstring>
#include<iostream>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=1e5+5,M=30;
int n,m,k,num[N],mp[M][M],dp[N][M],sum[M][N],an[M],minn[N];
string s;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k>>s;s='6'+s;
for(int i=1;i<=n;i++) num[i]=s[i]-'a'+1;
for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) cin>>mp[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=m;k++)
if(i!=j&&j!=k&&k!=i)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
// cout<<endl;
// for(int i=1;i<=m;i++){
// for(int j=1;j<=m;j++) cout<<mp[i][j]<<" ";
// cout<<endl;
// }
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
sum[i][j]=sum[i][j-1]+mp[num[j]][i];
}
}
memset(an,0x3f,sizeof(an));
memset(minn,0x3f,sizeof(minn));minn[0]=0;
for(int i=k;i<=n;i++){
for(int j=1;j<=m;j++){
int nowlen=sum[j][i]-sum[j][i-k];
an[j]=min(an[j]+mp[num[i]][j],minn[i-k]+nowlen);
minn[i]=min(minn[i],an[j]);
}
}
cout<<minn[n];
return 0;
}