題目鏈接:Codeforces - Clear the String
應該是比較暴力的區間dp了。
比如當前區間爲[l,r],那麼要麼爲1+[l+1,r],要麼找一個與str[l]相同的字母,縮掉中間的。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=510;
int n,cnt,dp[N][N]; char str[N],a[N];
int solve(int l,int r){
if(l>r) return 0;
if(l==r) return dp[l][r]=1;
if(dp[l][r]!=0x3f3f3f3f) return dp[l][r];
dp[l][r]=1+solve(l+1,r);
for(int k=l+1;k<=r;k++)
if(str[l]==str[k]) dp[l][r]=min(dp[l][r],solve(l+1,k-1)+solve(k,r));
return dp[l][r];
}
signed main(){
cin>>n; scanf("%s",a+1); memset(dp,0x3f3f3f3f,sizeof dp);
for(int i=1;i<=n;i++) if(a[i]!=a[i-1]) str[++cnt]=a[i];
cout<<solve(1,cnt);
return 0;
}