比赛 2025暑期集训第6场 评测结果 AAAAAAAAAAAAAAAA
题目名称 Moortal Cowmbat 最终得分 100
用户昵称 rzzakioi 运行时间 0.287 s
代码语言 C++ 内存使用 10.02 MiB
提交时间 2025-07-12 11:12:39
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=100005;
int c[30][30],f[N];
char s[N];
int sum[30][N];
int query(int x,int l,int r){
	return sum[x][r]-sum[x][l-1];
}
int mn[30];
int main(){
    freopen ("cowmbat.in","r",stdin);
	freopen ("cowmbat.out","w",stdout);
	int n,m,k;
    memset (mn,0x3f,sizeof(mn));
	memset (f,0x3f,sizeof(f));
    scanf ("%d%d%d",&n,&m,&k);
	scanf ("%s",s+1);
	for (int i=0;i<m;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&c[i][j]);
        }
    }			
	for (int l=0;l<m;l++){
        for (int i=0;i<m;i++){
            for (int j=0;j<m;j++){
                if (i!=j&&j!=l&&i!=l){
                    c[i][j]=min(c[i][j],c[i][l]+c[l][j]);
                }
            }
        }
    }		
	for (int i=0;i<m;i++){
        for (int j=1;j<=n;j++){
            sum[i][j]=c[s[j]-'a'][i]+sum[i][j-1];
        }
    }
	f[0]=0;
	for (int i=k;i<=n;i++){
        for (int j=0;j<m;j++){
            mn[j]=min(mn[j]+c[s[i]-'a'][j],f[i-k]+query(j,i-k+1,i)),f[i]=min(f[i],mn[j]);
        }
    }
	printf ("%d",f[n]);
	return 0;
}