0
点赞
收藏
分享

微信扫一扫

洛谷CF1132F Clear the String 题解 区间DP

题目链接:​​https://codeforces.com/problemset/problem/1132/F​​

题目大意:

给你一个串 \(s\),每次可以花费 \(1\) 的代价删去一个子串,要求子串的每一位为同一个字符。

求删去整个串的最小代价。

\(1\le |s|\le 500\)

解题思路:

区间DP。

我们设 \(f_{l,r}\) 代表删除 \(l\) 到 \(r\) 之间的所有字符的最小花费。

那么有两种决策:

  1. 单独删掉开头的字符,则 \(f_{l,r} = f_{l+1,r} + 1\) 。
  2. 在串中找到一个与开头字符相同的位置一块删,我们枚举中间位置 \(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\n", dfs(0, n-1));
return 0;
}


举报

相关推荐

0 条评论