首页 > 代码库 > Partitioning by Palindromes
Partitioning by Palindromes
uva11584:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2631
题意:给你一个串,问你这个串最少被划分成多少个子串,才能使得每个子串都是回文子串。
题解:一开始不知道用什么方法来解题,回来才知道是DP。状态方程:f【i】,表示从0到i,至少被划分的子串个数。转移方程f【i】=min(f【i-1】+1,f【j-1】+1)(其中j表示,从j到i之间的字母构成回文串),然后枚举满足条件的j,最后的答案就是f【len-1】。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int f[1003]; 7 char str[1002]; 8 bool check(int x,int y){//判断是不是回文串 9 while(x<y){10 if(str[y]!=str[x])return false;11 x++;12 y--;13 }14 return true;15 }16 int main(){17 int T;18 scanf("%d",&T);19 while(T--){20 scanf("%s",str);21 memset(f,0,sizeof(f));22 int len =strlen(str);23 f[0]=1;24 for(int i=1;i<len;i++){25 f[i]=f[i-1]+1;26 for(int j=i-1;j>=0;j--){27 if(str[j]==str[i]){28 if(check(j,i)){29 f[i]=min(f[i],f[j-1]+1);30 }31 }32 }33 }34 printf("%d\n",f[len-1]);35 }36 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。