这个是给你一个字符串,问这个最少能划分成几个回文串,。
思路这个其实就是,dp[i] = max(dp[i],dp[j]+1)。(dp表示以i为结尾的串能划分成多少个回文串)就是,如果(i,j]中间是回文串的话,那么转移成立,这个是n三方的复杂度,数据范围是1000,其实不能过的,但是不知道怎么就过了,我等哪天有时间研究研究n方的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char str[1010];
int dp[1010];
bool check(int i , int j)
{
int l = j + 1 , r = i;
//printf("i = %d j = %d",l ,r);
while(l <= r){
if(str[l] != str[r]){
//printf("%d %d\n",l,r);
return false;
}
l++,r--;
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%s", str + 1);
int l = strlen(str + 1);
dp[0] = 0;
for(int i = 1 ; i <= l ; i++){
dp[i] = i ;
for(int j = 0 ; j < i ; j++){
if(check(i,j)){
dp[i] = min(dp[i],dp[j] + 1);
// printf("%d %d %d\n",j,i,dp[i]);
}
}
}
printf("%d\n",dp[l]);
}
return 0;
}
wyy这个小王八蛋。。。。她竟然。。。。我一开始以为是t出了bug,后来发现。。。。。woc好好学习吧,孩纸