找出一段字符串中最少数量的回文串划分
dp[ i ] = min ( dp[ i ], dp[ j - 1 ] + 1 )
DP还是写不出来状态转移
虽然知道是根据已知的来求未知的。。。
但依旧找不到正确的应该求的量和之间的状态转移方程(绝望脸233333)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char str[ 1009 ];
int dp[ 1009 ]; //前i个字符中分段的数量
//判断j到i之间是否是回文数
bool palindrom ( int x, int y ) {
while ( x < y ) {
if ( str[ x ] != str[ y ] )
return false;
++x;
--y;
}
return true;
}
int main () {
int t;
scanf ( "%d", &t );
while ( t-- ) {
scanf ( "%s", str + 1 );
int len = strlen ( str + 1 );
memset ( dp, 0, sizeof ( dp ) );
for ( int i = 1; i <= len; i++ ) {
dp[ i ] = i;
for ( int j = 1; j <= i; j++ ) {
if ( palindrom ( j, i ) )
dp[ i ] = min ( dp[ i ], dp[ j - 1 ] + 1 );
}
}
printf ( "%d\n", dp[ len ] );
}
return 0;
}