#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