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 }
posted @ 2017-08-04 10:56  wydxry  阅读(268)  评论(0编辑  收藏  举报
Live2D