题意
给一个字符串,求这个字符串最少可以分割成几个回文串。
题解
很简单的线性dp。但是,不做预处理的复杂度是,预处理后可以降到。
对于预处理的各种想法日后在整理。。。
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 1000+1;
const int INF = 0x3f3f3f3f;
int dp[maxn];
char st[maxn];
bool ispali(int j, int i){
j--;i--;
while(j<i){
if(st[j] != st[i]) return false;
j++; i--;
}
return true;
}
int main(){
int T;
scanf("%d", &T);
dp[0] = 0;
while(T--){
scanf("%s", st);
int n = strlen(st);
dp[1] = 1;
for(int i = 2; i<=n; i++){
dp[i] = dp[i-1];
for(int j = i-1; j>0; j--)if(ispali(j,i)){
dp[i] = min(dp[i], dp[j-1]);
}
dp[i]++;
}
printf("%d\n", dp[n]);
}
return 0;
}