uva11584

Posted pandaking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva11584相关的知识,希望对你有一定的参考价值。

输入一个由小写字母组成的字符串,你的任务是把它分成划分成尽量少的回文串,例如,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的主要内容,如果未能解决你的问题,请参考以下文章

UVA 11584Partitioning by Palindromes

UVa 11584 Partitioning by Palindromes (简单DP)

UVA - 11584 Partitioning by Palindromes[序列DP]

UVA11584-Partitioning by Palindromes(动态规划基础)

UVA11584-Partitioning by Palindromes(动态规划基础)

UVa 11584 划分成回文串