UVa 11584 - Partitioning by Palindromes 回文串dp
来源:互联网 发布:鞋子淘宝店 编辑:程序博客网 时间:2024/05/23 18:19
Problem H: Partitioning by Palindromes
We say a sequence of characters is a palindrome if it is the same written forwards and backwards. For example, 'racecar' is a palindrome, but 'fastcar' is not.
A partition of a sequence of characters is a list of one or more disjoint non-empty groups of consecutive characters whose concatenation yields the initial sequence. For example, ('race', 'car') is a partition of 'racecar' into two groups.
Given a sequence of characters, we can always create a partition of these characters such that each group in the partition is a palindrome! Given this observation it is natural to ask: what is the minimum number of groups needed for a given string such that every group is a palindrome?
For example:
- 'racecar' is already a palindrome, therefore it can be partitioned into one group.
- 'fastcar' does not contain any non-trivial palindromes, so it must be partitioned as ('f', 'a', 's', 't', 'c', 'a', 'r').
- 'aaadbccb' can be partitioned as ('aaa', 'd', 'bccb').
Input begins with the number n of test cases. Each test case consists of a single line of between 1 and 1000 lowercase letters, with no whitespace within.
For each test case, output a line containing the minimum number of groups required to partition the input into groups of palindromes.
Sample Input
3racecarfastcaraaadbccb
Sample Output
173
我又智硬了吗orz
f[i]=min(f[j-1]+1) ( j<i,rev[j,i])
-----------------------
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int OO=1e9;int n;char s[1111];int f[1111];bool rev[1111][1111];int main(){ int T; scanf("%d",&T); while (T--) { memset(rev,0,sizeof(rev)); scanf("%s",s+1); n=strlen(s+1); for (int i=1;i<=n;i++) { rev[i][i]=true; if (s[i]==s[i+1]&&i+1<=n) { rev[i][i+1]=true; } } for (int k=2;k<=n;k++) { for (int i=1;i+k<=n;i++) { if (s[i]==s[i+k]&&rev[i+1][i+k-1]) { rev[i][i+k]=true; } } } for (int i=1;i<=n;i++) f[i]=OO; f[0]=0; for (int i=1;i<=n;i++) { for (int j=1;j<=i;j++) { if (rev[j][i]) { f[i]=min(f[i],f[j-1]+1); } } } int ans=f[n]; printf("%d\n",ans); } return 0;}
- uva 11584 Partitioning by Palindromes 回文+dp
- UVa 11584 - Partitioning by Palindromes 回文串dp
- UVA 11584 Partitioning by Palindromes 回文串dp
- uva 11584Partitioning by Palindromes dp(最少回文串划分)
- UVA 11584 Partitioning by Palindromes (回文DP,4级)
- UVA 11584 Partitioning by Palindromes 划分成回文串(DP + 预处理)
- UVA-11584-Partitioning by Palindromes(区间DP 最小回文串数量)
- uva 11584 - Partitioning by Palindromes (dp)
- uva 11584 - Partitioning by Palindromes(简单dp)
- UVA 11584 - Partitioning by Palindromes(基础dp)
- uva 11584 - Partitioning by Palindromes(DP)
- UVA 11584 - Partitioning by Palindromes DP
- uva 11584 - Partitioning by Palindromes(dp)
- uva 11584 Partitioning by Palindromes | dp
- uva 11584 Partitioning by Palindromes dp
- Partitioning by Palindromes - UVa 11584 dp
- 【uva-11584】Partitioning by Palindromes(dp)
- Uva 11584 - Partitioning by Palindromes dp
- Java内存泄露
- 表1表2中的记录插入表3中
- PPT新视角——VBA应用技术
- 自动安装apk
- yingwen
- UVa 11584 - Partitioning by Palindromes 回文串dp
- 使用FFMPEG合并视频
- int *p[4]和 int (*q)[4]的区别
- 页面跳转
- jni动态注册
- VC++动态链接库编程之MFC规则DLL
- MySQL详解:日志类型
- 如何让照片小于20K
- 年轻的优秀博士:网络牛人刘云浩,王新兵,朱其立