状态
dp[ i ] 表示从长度为1的位置到长度为 i 的位置的最少切割次数
状态转移方程
if( i 到 j 是回文串 )
dp [ i ] = min ( dp[ i ] , dp[ j-1 ] + 1)
#include <iostream>
#include <memory.h>
#include <string>
using namespace std;
int t;
string s;
int dp[1005];
int check(int left, int right)
{
int mid = (left + right ) / 2;
for( int i = left; i <= mid; i++ )
if( s[i] != s[right + left - i] )
return false;
return true;
}
int main()
{
cin >> t;;
while( t-- )
{
s.clear();
cin >> s;
memset(dp, 0, sizeof(dp));
int len = s.size();
for( int i = 2; i <= len; i++ )
dp[i] = (1<<30);
dp[0] = -1;dp[1] = 0;
for( int i = 2; i <= len; i++ )
for( int j = 1; j <= i; j++ )
{
if( check(j-1,i-1) )
dp[i] = min(dp[i], dp[j-1] + 1);
}
cout << dp[len] << endl;
}
return 0;
}
注意边界取值