您的位置:首页 > 其它

UVa11584 Partitioning by Palindromes

2017-07-31 08:21 323 查看
题目描述



求最少能划成多少个回文串,比较简单。

设f(i)为前i个字符组成的串最少能划分成多少个。

f(i)=min(f(j)+1) (j+1~i是回文串)

如果临时判断回文串要O(n)的时间。

总时间复杂度O(n3)

用O(n2)的时间预处理后可降为O(1)

总时间复杂度降为O(n2)

代码

#include<cstdio>

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

char s[1010];

bool is[1010][1010];

int f[1010];

int main(){

int t;

cin>>t;

while(t--){

scanf("%s",s+1);

int l=strlen(s+1);

memset(is,0,sizeof(is));

for(int i=1;i<=l;i++){

for(int k=0;i-k>0&&i+k<=l;k++)

if(s[i-k]==s[i+k]) is[i-k][i+k]=1;

else break;

if(s[i]==s[i+1]){

for(int k=0;i-k>0&&i+k+1<=l;k++)

if(s[i-k]==s[i+k+1]) is[i-k][i+k+1]=1;

else break;

}

}

f[0]=0;

for(int i=1;i<=l;i++){

f[i]=i;

for(int j=0;j<i;j++){

if(is[j+1][i]) f[i]=min(f[i],f[j]+1);

}

}

printf("%d\n",f[l]);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: