比赛 2025暑期集训第6场 评测结果 AAAAAAAAAAAAAAAA
题目名称 Moortal Cowmbat 最终得分 100
用户昵称 wdsjl 运行时间 0.278 s
代码语言 C++ 内存使用 10.03 MiB
提交时间 2025-07-12 11:21:48
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
int c[30][30], f[N];
char s[N];
int sm[30][N];
int g[30];

int query(int x, int l, int r) {
    return sm[x][r] - sm[x][l-1];
}

int main() {
    freopen("cowmbat.in", "r", stdin);
    freopen("cowmbat.out", "w", stdout);
    int n, m, k;
    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++)
            sm[i][j] = c[s[j]-'a'][i] + sm[i][j-1];
    memset(g, 0x3f, sizeof(g));
    memset(f, 0x3f, sizeof(f));
    f[0] = 0;
    for (int i = k; i <= n; i++)
        for (int j = 0; j < m; j++)
            g[j] = min(g[j] + c[s[i]-'a'][j], f[i-k] + query(j, i-k+1, i)),
            f[i] = min(f[i], g[j]);
    
    printf("%d", f[n]);
    return 0;
}