给你一个串 (s),每次可以花费 (1) 的代价删去一个子串,要求子串的每一位为同一个字符。求删去整个串的最小代价。(1le |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;
}