比赛 2025暑期集训第6场 评测结果 AAAAAAAAAAAAAAAA
题目名称 Moortal Cowmbat 最终得分 100
用户昵称 左清源 运行时间 0.479 s
代码语言 C++ 内存使用 35.92 MiB
提交时间 2025-07-12 09:24:06
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,K,s[N][26],v[26][26];
int f[N],mn[N][26];
char str[N];
signed main(){
	freopen("cowmbat.in","r",stdin);
	freopen("cowmbat.out","w",stdout);
	scanf("%lld %lld %lld",&n,&m,&K);
	scanf("%s",str+1);
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			scanf("%lld",&v[i][j]);
		}
	}
	for(int k=0;k<m;k++){
		for(int i=0;i<m;i++){
			for(int j=0;j<m;j++){
				v[i][j]=min(v[i][j],v[i][k]+v[k][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		int ch=str[i]-'a';
		for(int j=0;j<26;j++){
			s[i][j]=s[i-1][j]+v[ch][j];
		}
	}
	memset(f,0x3f,sizeof(f));
	memset(mn,0x3f,sizeof(mn));
	f[0]=0;for(int j=0;j<m;j++)mn[0][j]=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<m;j++)if(i>=K)f[i]=min(f[i],mn[i-K][j]+s[i][j]);
		for(int j=0;j<m;j++)mn[i][j]=min(mn[i-1][j],f[i]-s[i][j]);
	}
	printf("%lld\n",f[n]);
	return 0;
}