①删除字符串
题目描述
题目描述
给出一个长度为n的字符串,每次可以删除一个字母相同的子串,问最少需要删多少次。 数据规模:n <= 500
输入格式
第1行:1个整数,表示字符串的长度
第2行:n个字符的字符串
输出格式
第1行:1个整数,表示答案
样例
样例输入
5
abaca
样例输出
3
算法分析
此题即为典型的区间DP题,根据题目可以设以 dp[l,r]是为 l 到 r区间删除完字符串的最小次数,可分两种情况讨论:
一般情况下,dp[l,r]由长度可以通过 dp[l+1,r]或 dp[l,r−1]增加一个字符得到,此时取两者之间的最小值。
枚举 k∈(l,r),用 k作为决策点,如果 c[l]=c[k]即可以通过 dp[l][k−1]+dp[k][r]直接得到, 注意此处不需要加一, 因为c[l]和 c[k]是相同字符,所以可以直接删除,而在计算c[l] 和 c[k]时,已经加一所以,不需要加一!
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1005;
char s[M];
int f[M][M];
int main(){
int n;
scanf("%d",&n);
scanf("%s",&s[1]);
for(int i=1;i<=n;i++){
f[i][i]=1;
}
for(int len=1;len<=n;len++){
for(int l=1;l<=n-len;l++){
int r=len+l;
if(s[l]==s[r]){
f[l][r]=f[l+1][r-1