#include <bits/stdc++.h>
using namespace std;
const int N = 60;
string str;
int dp[N][N];
int main(){
cin>>str;
int n = str.size();
memset(dp,0x3f,sizeof dp);
str = ' ' + str;
for(int i = 0;i<n;i++){
for(int j = 1;j+i<=n;j++){
int k = j + i;
if(j==k) dp[j][k] = 1;
else if(str[j]==str[k]) dp[j][k] = min(dp[j+1][k],dp[j][k-1]);
else{
for(int k2 = j;k2<k;k2++){
dp[j][k] = min(dp[j][k],dp[j][k2]+dp[k2+1][k]);
}
}
}
}
cout<<dp[1][n];
return 0;
}
左边界等于右边界时,dp[j][k]=1,如果str[j]==str[kl]那么就取min(dp[j+1][k],dp[j][k-1]),否则取他们之间的最小值
#牛客春招刷题训练营#https://www.nowcoder.com/discuss/727521113110073344

京公网安备 11010502036488号