题意:一个长串最少能划分为几个回文串
状态转移:如果j - i 是回文串(i > j),那么 dp[ i ] = dp[ j - 1] + 1; 对于一个 i 可能存在好多 j ,所以:
边界是 dp[ 0 ] = 0;
转移方程 :dp[ i ] = min(dp[ i ], dp[ j-1 ] + 1);
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 7;
const int INF = 0x3f3f3f3f;
int n, len;
int dp[maxn];
char s[maxn];
bool judge(int l, int r) {
while(l <= r) {
if(s[l] != s[r]) return false;
l++, r--;
}
return true;
}
void init() {
s[0] = '0';
scanf("%s", s+1);
len = strlen(s);
}
void solve() {
memset(dp, INF, sizeof dp);
dp[0] = 0;
for(int i = 1; i < len; ++i)
for(int j = 1; j <= i; ++j) {
if(judge(j, i)) dp[i] = min(dp[i], dp[j-1] + 1);
}
cout << dp[len-1] << endl;
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
init();
solve();
}
return 0;
}