UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2631
题目大意:
给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。
分析:
f[i]表示以i结尾的串最少可以分割的串数。
f[i] = min{ f[j]+1, 串[j,i]是回文串&&1<=j<=i }
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23 #define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 char str[N]; 35 int f[N]; 36 bool isPalind(int l, int r){ 37 while(l<r){ 38 if(str[l]!=str[r]) return false; 39 ++l; 40 --r; 41 } 42 return true; 43 } 44 int main(){ 45 int t; 46 scanf("%d",&t); 47 while(t--){ 48 scanf("%s",str+1); 49 int len=strlen(str+1); 50 mem(f); 51 for(int i=1;i<=len;i++){ 52 f[i]=i+1; 53 for(int j=1;j<=i;j++) 54 if(isPalind(j,i)) 55 f[i]=min(f[i],f[j-1]+1); 56 } 57 printf("%d\n",f[len]); 58 } 59 return 0; 60 }