给你一个串 \(s\),每次可以花费 \(1\) 的代价删去一个子串,要求子串的每一位为同一个字符。求删去整个串的最小代价。\(1\le |s|\le 500\)
Solution
设 \(f[i][j]\) 表示删除子串 \([i,j]\) 的最小花费,则
\[f[i][j]=\min (f[i][j],f[i][k]+f[k+1][j]+1-[s[k]=s[j]])
\]
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 505;
char s[N];
int n,f[N][N];
signed main() {
ios::sync_with_stdio(false);
cin>>n>>s+1;
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++) f[i][i]=0;
for(int l=1;l<n;l++) {
for(int i=1;i+l<=n;i++) {
int j=i+l;
for(int k=i;k<j;k++) {
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+1-(s[k]==s[j]));
}
}
}
cout<<f[1][n]+1;
}