题目链接:https://codeforces.com/problemset/problem/1132/F
题目大意:
给你一个串 (s),每次可以花费 (1) 的代价删去一个子串,要求子串的每一位为同一个字符。
求删去整个串的最小代价。
(1le |s|le 500)
解题思路:
区间DP。
我们设 (f_{l,r}) 代表删除 (l) 到 (r) 之间的所有字符的最小花费。
那么有两种决策:
- 单独删掉开头的字符,则 (f_{l,r} = f_{l+1,r} + 1) 。
- 在串中找到一个与开头字符相同的位置一块删,我们枚举中间位置 (k) ,则有 (f_{l,r} = min (f_{l+1,k-1},f_{k,r})) 。
示例代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
int n;
char s[maxn];
int f[maxn][maxn];
int dfs(int L, int R) {
if (L > R) return 0;
if (f[L][R] != -1) return f[L][R];
f[L][R] = 1 + dfs(L+1, R);
for (int k = L+1; k <= R; k ++)
if (s[L] == s[k])
f[L][R] = min(f[L][R], dfs(L+1, k-1) + dfs(k, R));
return f[L][R];
}
int main() {
memset(f, -1, sizeof(f));
scanf("%d%s", &n, s);
printf("%d
", dfs(0, n-1));
return 0;
}