rt,用可行性 dp 转移,不知道哪里寄了,求个 hack。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3e2 + 10;
int n, m; char s[MAXN];
bool f[MAXN][MAXN]; int dp[MAXN];
int main() {
scanf("%s%d", s + 1, &m), n = strlen(s + 1);
for (int i = 1; i <= n; i++) f[i][i - 1] = 1;
for (int len = 2; len <= n; len++) {
for (int l = 1, r = len; r <= n; l++, r++) {
if (f[l + 1][r - 1] && s[l] == 'o' && s[r] == 'f') {
for (int i = r; i <= r + m && i <= n; i++) f[l][i] = 1;
}
for (int i = l; i < r; i++) f[l][r] |= f[l][i] && f[i + 1][r];
}
}
for (int i = 1; i <= n; i++) {
dp[i] = dp[i - 1] + 1;
for (int j = 1; j <= i; j++) if (f[j][i]) dp[i] = min(dp[i], dp[j - 1]);
}
printf("%d", dp[n]);
}