/*
先用dp[i][j]预处理出[i,j]这个区间的回文串
然后用ans[i]dp出到i这个位置最少的分割次数
如果dp[0][i]是一个回文串那就直接分割0次
否则分割[0,i]这个区间由于[0,j]这个区间的ans已经求出
我们只要判断s[j+1][i]这个区间是不是回文如果是就ans[j]+1
*/
class Solution {
public:
int minCut(string s) {
int n=s.size();
vector<vector<int>> dp(n+10,vector<int>(n+10));
for(int i=0;i<n;i++)
{
dp[i][i]=1;
for(int j=0;j<i;j++)
{
if(s[j]==s[i] && ((i-j>=2 && dp[j+1][i-1]) || j+1==i))
dp[j][i]=1;
}
}
vector<int> ans(n+10);
for(int i=0;i<n;i++) ans[i]=100000000;
for(int i=0;i<n;i++)
{
if(dp[0][i])
{
ans[i]=0;
continue;
}
for(int j=0;j<i;j++)
{
if(dp[j+1][i])
{
ans[i]=min(ans[i],ans[j]+1);
}
}
}
return ans[n-1];
}
};