码迷,mamicode.com
首页 > 其他好文 > 详细

uva11584

时间:2018-11-04 00:33:23      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:while   ios   none   style   break   code   names   display   任务   

输入一个由小写字母组成的字符串,你的任务是把它分成划分成尽量少的回文串,例如,racecar本身就是一个回文串,fastcar只能分成7个单字母的回文串,aaadbccb最少分成3个回文串,aaa,d,bccb。字符串长度不超过1000。

这道题思路也很简单,就是延续了上升子序列的思想而已。所以没有啥好说的,注意一下先预处理好回文子串即可

技术分享图片
 1 #include<cstring>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1100;
 7 char sz[maxn];
 8 int hw[maxn][maxn];
 9 int dp[maxn];
10 int t,len;
11 int main(){
12     scanf("%d",&t);
13     while(t--){
14         scanf("%s",sz+1);
15         len=strlen(sz+1);
16         for(int i=1;i<=len;i++){
17             for(int j=1;j<=len;j++){
18                 if(i==j) hw[i][j]=1;
19                 else hw[i][j]=0;
20             }
21         }
22         for(int i=1;i<=len;i++){
23             for(int j=1;j<=len;j++){
24                 if(i-j<=0||i+j>len) break;
25                 if(sz[i-j]==sz[i+j]) hw[i-j][i+j]=1;
26                 else break;
27             }
28             for(int j=1;j<=len;j++){
29                 if(i-j+1<=0||i+j>len) break;
30                 if(sz[i-j+1]==sz[i+j]) hw[i-j+1][i+j]=1;
31                 else break;
32             }
33         }
34         memset(dp,0,sizeof(dp));
35         for(int i=1;i<=len;i++){
36             dp[i]=i;
37             for(int j=0;j<i;j++){
38                 if(hw[j+1][i]==1) dp[i]=min(dp[i],dp[j]+1);
39             }
40         }
41         cout<<dp[len]<<endl;
42     }
43     return 0;
44 } 
View Code

 

uva11584

标签:while   ios   none   style   break   code   names   display   任务   

原文地址:https://www.cnblogs.com/pandaking/p/9902433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!