比赛 |
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;
}