原题地址
。差不多是个水题罢,难度个人认为是红
设
表示区间
与答案匹配,考虑区间dp
若
,则
,显然
若
,则
,相当于给
刷一下,然后带着
或
一起刷qwq
若
,则
,分两个更小的区间涂,枚举断点。
假的蓝题。
:
# include <bits/stdc++.h>
using namespace std;
string s;
int n;
int dp[700][700];
void solve(void)
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=INT_MAX;
for(int len=1;len<=n;len++)
{
for(int i=1;i<=n;i++)
{
int j=i+len-1;
if(len==1)
{
dp[i][j]=1;
}
else
{
if(s[i-1]==s[j-1])
{
dp[i][j]=min(dp[i+1][j],dp[i][j-1]) ;
}
else
{
for(int k=i;k<j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]) ;
}
}
}
}
}
cout<<dp[1][n]<<endl;
return ;
}
int main(void)
{
cin >> s;
n=s.size() ;
solve() ;
return 0;
}