比赛 2025暑期集训第6场 评测结果 AAAAAAAAAAAAAAAW
题目名称 Moortal Cowmbat 最终得分 94
用户昵称 李金泽 运行时间 1.576 s
代码语言 C++ 内存使用 30.56 MiB
提交时间 2025-07-12 10:29:22
显示代码纯文本
#include<cstdio>
#include<cstring>
#define N 100005
#define M 30
#define ri register int
using namespace std;
int n,m,K,a[N],f[N][M],g[N][M],d[M][M],s[M][N],ans=2147483647;
char c[N];
int min(int x,int y){return x<y?x:y;}
void init()
{
	scanf("%d%d%d",&n,&m,&K);
	scanf("%s",c+1);
	for(ri i=1;i<=n;i++)a[i]=c[i]-96;
	for(ri i=1;i<=m;i++)
		for(ri j=1;j<=m;j++)
			scanf("%d",d[i]+j);
	for(ri k=1;k<=m;k++)
		for(ri i=1;i<=m;i++)
			for(ri j=1;j<=m;j++)
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
	for(ri i=1;i<=m;i++)
		for(ri j=1;j<=n;j++)
			s[i][j]=s[i][j-1]+d[a[j]][i];
}
int main(){
	freopen("cowmbat.in","r",stdin);freopen("cowmbat.out","w",stdout);
	init();
	
	memset(f,0x3f,sizeof(f));
	memset(g,0x3f,sizeof(g));
	for(ri i=K;i<min(n,2*K);i++)
		for(ri j=1;j<=m;j++)
		{
			f[i][j]=s[j][i];
			g[i][j]=min(f[i][j],g[i-1][j]+d[a[i]][j]);
			for(ri k=1;k<=m;k++)
				g[i][j]=min(g[i][j],f[i-1][k]+d[a[i]][j]);
		}
	
	for(ri i=2*K;i<=n;i++)
		for(ri j=1;j<=m;j++)
		{
			f[i][j]=g[i-K][j]+s[j][i]-s[j][i-K];
			for(ri k=1;k<=m;k++)
				f[i][j]=min(f[i][j],f[i-K][k]+s[j][i]-s[j][i-K]);
			g[i][j]=min(f[i][j],g[i-1][j]+d[a[i]][j]);
			for(ri k=1;k<=m;k++)
				g[i][j]=min(g[i][j],f[i-1][k]+d[a[i]][j]);
		}
	for(ri i=1;i<=m;i++)ans=min(ans,f[n][i]);
	printf("%d",ans);
	return 0;
}