传送门:http://vjudge.net/contest/141412#problem/A (密码cd)
题意:给定一个字符串, 问最少分为几部分可使各部分均为回文串
思路:
1 dp[i] 表示以i结尾的最少分割数
2 dp[i] = min(dp[j-] + 1 && j-i为回文)
复杂度O(n^3),这题数据好像比较水不需要紫书上说的预处理
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int dp[N];
char s[N];
bool ok(int x, int y){
while(x<=y){
if(s[x]!=s[y])return false;
x++; y--;
}
return true;
}
int main(){
// ios::sync_with_stdio(false);
int T;
scanf("%d", &T);
while(T--){
scanf("%s", s+1);
int n=strlen(s+1);
for(int i=1; i<=n; i++){
dp[i]=i;
for(int j=1; j<=i; j++){
if(ok(j, i))dp[i]=min(dp[i], dp[j-1]+1);
}
}
printf("%d\n", dp[n]);
}
return 0;
}