| 比赛 |
2026.1.3 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
字符串游戲 |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
1.762 s |
| 代码语言 |
C++ |
内存使用 |
104.23 MiB |
| 提交时间 |
2026-01-03 11:08:05 |
显示代码纯文本
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 205;
const int MAXM = 25;
const int INF = 0x3f3f3f3f;
//f[l][r] 消除区间所需的最小次数
int f[MAXN][MAXN];
//g[l][r][i][k] 区间 l , r 删至只剩第 i 个模式串的前 j 个字符的最小次数
int g[MAXN][MAXN][MAXM][MAXM];
int n, m, k, c[MAXN], ans[MAXN][MAXN];
string s, w[MAXM];
int main(){
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
cin >> s;
s = " " + s;
for(int i = 1;i <= m;i ++){
cin >> w[i];
c[i] = w[i].length();
w[i] = " " + w[i];
}
memset(f, 0x3f, sizeof(f));
memset(g, 0x3f, sizeof(g));
for(int i = 1;i <= n + 1;i ++){
f[i][i - 1] = 0;
for(int j = 1;j <= m;j ++){
g[i][i - 1][j][0] = 0;
}
}
for(int len = 1;len <= n;len ++){
for(int l = 1;l + len - 1 <= n;l ++){
int r = l + len - 1;
for(int i = 1;i <= m;i ++){
for(int j = 1;j <= c[i];j ++){
if(s[r] == w[i][j]){
g[l][r][i][j] = min(g[l][r][i][j], g[l][r - 1][i][j - 1]);
}
}
for(int mid = l;mid <= r;mid ++){
if(f[mid][r] <= k){
for(int j = 0;j <= c[i];j ++){
if(g[l][mid - 1][i][j] < INF){
g[l][r][i][j] = min(g[l][r][i][j], g[l][mid - 1][i][j] + f[mid][r]);
}
}
}
}
if(g[l][r][i][c[i]] < INF){
f[l][r] = min(f[l][r], g[l][r][i][c[i]] + 1);
}
}
}
}
memset(ans, 0x3f, sizeof(ans));
for(int j = 0;j <= k;j ++){
ans[0][j] = 0;
}
for(int i = 1;i <= n;i ++){
for(int j = 0;j <= k;j ++){
ans[i][j] = ans[i - 1][j] + 1;
for(int pre = 1;pre <= i;pre ++){
if(f[pre][i] <= j){
ans[i][j] = min(ans[i][j], ans[pre - 1][j - f[pre][i]]);
}
}
}
}
int res = n;
for(int j = 0;j <= k;j ++) res = min(res, ans[n][j]);
cout << res << '\n';
return 0;
}