首页 > 代码库 > UVa 11584 划分成回文串
UVa 11584 划分成回文串
https://vjudge.net/problem/UVA-11584
题意:
给出一串字符,把它划分成尽量少的回文串。
思路:
用d[i]表示划分到i时所能划分的最小个数,转移方程为d[i]=min{d[i],d[j]+1},当然前提是j+1~i是回文串,我们可以预处理计算出所有的回文串,这样转移时就比较方便。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 9 int ans[maxn][maxn];10 char a[maxn];11 int d[maxn];12 13 int main()14 {15 //freopen("D:\\txt.txt", "r", stdin);16 int t;17 cin >> t;18 while (t--)19 {20 memset(ans, 0, sizeof(ans));21 memset(d, 0, sizeof(d));22 cin >> a+1;23 int l = strlen(a+1);24 25 //打表,判断i~j是否是回文串26 for (int i = 1; i <= l; i++)27 {28 for (int j = i; j <= l; j++)29 {30 int left = i, right = j;31 int ok = 1;32 while (left <= right)33 {34 if (a[left] != a[right])35 {36 ok = 0;37 break;38 }39 left++;40 right--;41 }42 if (ok) ans[i][j] = 1;43 }44 }45 46 d[0] = 0;47 for (int i = 1; i <= l; i++)48 {49 d[i] = d[i-1]+1; 50 for (int j = 1; j <= i; j++)51 {52 if (ans[j][i]) 53 d[i] = min(d[i], d[j-1] + 1);54 }55 }56 cout << d[l] << endl;57 }58 return 0;59 }
UVa 11584 划分成回文串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。