//将一个序列分解成回文子序列的最小分割次数
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=5e2+9;
ll dp[N][N];
char s[N];
int main()
{
cin>>s+1; //读取一个字符串,但是从数组的第二个位置(即 s[1])开始存储输入的字符
int n=strlen(s+1);//从 s + 1 开始的字符串的长度,并将其存储在变量 n 中
memset(dp,0x3f,sizeof(dp));//初始化
for(int i=1;i<=n;i++)dp[i][i]=1;
//各种长度;各种起点,各种分割点
//没有会问正常吃,有回文就赚了
for(int len=2;len<=n;len++)
{
for(int l=1;l+len-1<=n;l++)
{
int r=len+l-1;
//对区间进行考虑,有特殊的进行特殊处理
//两个区间只能包含关系,不能够有交集
if(s[l]==s[r])dp[l][r]=min(dp[l+1][r],dp[l][r+1]);
for(int k=l;k<r;k++)
{
dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
//不断分割,看有没有回文的
}
}
}
cout<<dp[1][n]<<endl;
return 0;
}
926 涂色
于 2025-01-20 20:27:46 首次发布