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 }
以上是关于uva11584的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11584Partitioning by Palindromes
UVa 11584 Partitioning by Palindromes (简单DP)
UVA - 11584 Partitioning by Palindromes[序列DP]
UVA11584-Partitioning by Palindromes(动态规划基础)