比赛 2025暑期集训第6场 评测结果 AAAAAAAAAAAAAAAA
题目名称 Moortal Cowmbat 最终得分 100
用户昵称 OTTF 运行时间 0.323 s
代码语言 C++ 内存使用 17.89 MiB
提交时间 2025-07-12 09:09:58
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>

using namespace std;

constexpr int N = 114514;

int n;
int m;
int k;
string str;
long long graph[30][30];
long long sum[N][30];
long long minn[30];
long long dp[N];

int main () {
	
	freopen ("cowmbat.in", "r", stdin);
	freopen ("cowmbat.out", "w", stdout);

	cin >> n >> m >> k >> str;
	str = ' ' + str;

	memset (graph, 0x3f, sizeof (graph));
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> graph[i][j];
		}
	}
	for (int l = 1; l <= m; l++) {
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= m; j++) {
				graph[i][j] = min (graph[i][j], graph[i][l] + graph[l][j]);
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			sum[i][j] = graph[str[i] - 'a' + 1][j] + sum[i - 1][j];
		}
	}

	memset (dp, 0x3f, sizeof (dp));
	dp[0] = 0;
	for (int i = k; i <= n; i++) {
		for (int c = 1; c <= m; c++) {
			// for (int j = 0; j <= i - k; j++) {
			// 	dp[i] = min (dp[i], dp[j] + sum[i][c] - sum[j][c]);
			// }
			dp[i] = min (dp[i], minn[c] + sum[i][c]);
			minn[c] = min (minn[c], dp[i - k + 1] - sum[i - k + 1][c]);
		}
	}

	cout << dp[n] << endl;
	
	return 0;
}