Light oj 1044 - Palindrome Partitioning (多校连萌,求最少回文子串的个数)
2016-03-29 17:17
363 查看
题目地址:http://lightoj.com/volume_showproblem.php?problem=1044
题意:把一个字符串分成几个子串,并且每个子串是回文子串,求最少得分成几个子串
思路:枚举起点和终点是O(n^2),再加上判断回文O(n^3),做一下记忆化时间会少到O(n^2)
AC代码:
题意:把一个字符串分成几个子串,并且每个子串是回文子串,求最少得分成几个子串
思路:枚举起点和终点是O(n^2),再加上判断回文O(n^3),做一下记忆化时间会少到O(n^2)
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x3f3f3f3f;//1061109567 typedef long long LL; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; char a[1010]; int visit[1010][1010],dp[1010]; int check(int st,int ed) { if(visit[st][ed] != -1) return visit[st][ed]; if(st > ed) return visit[st][ed] = 1; if(a[st] != a[ed]) return visit[st][ed] = 0; return visit[st][ed] = check(st+1,ed-1); } int main() { int t,cas = 1; scanf("%d",&t); while(t--) { memset(visit,-1,sizeof(visit)); memset(dp,0,sizeof(dp)); scanf("%s",a+1); int len = strlen(a+1); for(int i=1; i<=len; i++) { dp[i] = dp[i-1] + 1; for(int j=i-1; j>=1; j--) { if(a[i] == a[j] && check(j,i)) dp[i] = min(dp[i],dp[j-1]+1);//后面一个的意思是前面j-1个的数量加上1,1表示j到i是一个回文串 } } printf("Case %d: %d\n",cas++,dp[len]); } return 0; }
相关文章推荐
- Oracle学习(五)----多表查询
- php+js字符串的拼接
- 关于Tomcat安装过程中出现的一些问题...
- EventBus 框架详解
- javascript原生style属性分析
- JS模块化编程(一)
- 【剑指offer】(七)—— 用两个栈实现队列
- Android之viewstub用法详解及实现延迟加载
- 在写一个iOS应用之前必须做的7件事(附相关资源)
- 开通博客!
- Android自定义下方导航Tab
- css 伪类冒号前空格
- Android 5.0 SELinux 增加一个设备节点
- IOS学习之——如何 延迟执行
- RegressionBug和RegressionTest浅析
- 二叉后序遍历的两种写法
- CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解[转]
- js 闭包
- CDN
- 线段树或树状数组---Flowers