uva 11584 - 字符串 dp
Posted redips
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 11584 - 字符串 dp相关的知识,希望对你有一定的参考价值。
一个长度1000的字符串最少划分为几个回文字符串
-----------------------------------------------------------------------------------------------------------------
想复杂了。
首先N2的时间预处理一下,从i开始长度为len的字符串是否为回文串。
dist(i) = MIN(dist(i),dist(j)+1) 如果 j-i 为一个回文串
#include <set> #include <map> #include <stack> #include <queue> #include <cmath> #include <vector> #include <string> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b)) #define MIN(a,b) ((a)<=(b)?(a):(b)) #define OO 0x0fffffff using namespace std; typedef long long LL; const int N = 1024; bool dp[N][N]; int minDist[N]; char str[N]; int main(){ int n; for(cin>>n;n--;){ scanf("%s",str); int length = strlen(str); for(int i=0;i<length;i++) minDist[i] = i+1; memset(dp,false,sizeof(dp)); for(int len=0;len<2;len++) for(int i=0;i<length;i++) { dp[len][i]=true; } for(int len=2;len<=length;len++){ for(int i=0;i<length;i++){ if(len+i>length) break; dp[len][i] = (str[i]==str[i+len-1])&&(dp[len-2][i+1]); } } for(int i=1;i<length;i++){ for(int j=0;j<=i;j++){ if(dp[i-j+1][j]) minDist[i] = MIN(minDist[i],j?(minDist[j-1]+1):1); } } printf("%d\n",minDist[length-1]); } return 0; } /* 3 racecar fastcar aaadbccb */
以上是关于uva 11584 - 字符串 dp的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11584Partitioning by Palindromes
uva 11584 Partitioning by Palindromes 线性dp