【UVa11584】划分成回文串
题目描述
给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。 字符串长度不超过1000。
例如:
“racecar”本身就是回文串,答案为1
“fastcar”,答案为7,分成的7个回文串为"f", "a", "s", "t", "c", "a", "r"
“aaadbccb”,答案为3,分成的3个回文串为"aaa", "d", "bccb"
输入
第一行一个数T。接下来T行,每行一个字符串。
输出
对于每个字符串输出答案。
样例输入
3
racecar
fastcar
aaadbccb
样例输出
1
7
3
题解
dp[i] 为字符串中 1~i 划分成最少回文串的个数。则:
dp[ i ]=min( dp[ j ] + 1 ) 其中,s[ j+1 -> i ] 为回文串
于是我们发现时间复杂度来到了O(n3),不够优秀。考虑降低复杂度,我们用O(n2)的时间预处理出 s[ i --> j ] 是否为回文串
然后总时间复杂度降为 O(n2)。
#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define ll long longconst int maxn=1000+10;char a[maxn]; int dp[maxn],l,lef,rig; bool p[maxn][maxn];template<typename T>void read(T& aa) {char cc; ll ff;aa=0;cc=getchar();ff=1;while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();if(cc=='-') ff=-1,cc=getchar();while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();aa*=ff; }int main(){memset(dp,127,sizeof(dp));memset(p,false,sizeof(p));scanf("%s",a+1);l=strlen(a+1);for(int i=1;i<=l;i++){lef=i;rig=i;while(lef>0&&rig<=l){if(a[lef]==a[rig])p[lef][rig]=true;else break;lef--;rig++;}}for(int i=1;i<l;i++){lef=i;rig=i+1;while(lef>0&&rig<=l){if(a[lef]==a[rig])p[lef][rig]=true;else break;lef--;rig++;}}dp[1]=1;dp[0]=0;for(int i=2;i<=l;i++)for(int j=0;j<i;j++){if(p[j+1][i])dp[i]=min(dp[i],dp[j]+1);}cout<<dp[l]<<endl;return 0; }
转载于:https://www.cnblogs.com/rlddd/p/9495314.html
【UVa11584】划分成回文串相关推荐
- UVA11584 划分成回文串 Partitioning by Palindromes(线性DP划分+DP判断回文串)
整理的算法模板合集: ACM模板 依旧是线性DP 我们使用闫氏DP分析法 总体DP转移的时间复杂度为O(n2)O(n^2)O(n2). 但是这里牵扯到判断 i\tt ii 到 j\tt jj 是否为回 ...
- UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...
- 【132】求把字符串分割成回文串的最少切分次数
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...
- 动态规划之回文串问题
一.DP求回文串[POJ-1159] A palindrome is a symmetrical string, that is, a string read identically from lef ...
- poj3280 Cheapest Palindrome(回文串区间dp)
https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...
- 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II
LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...
- 2020年ICPC辽宁省赛- 最长回文串(Java)
最长回文串 题目描述 算法分析 代码展示 题目描述 链接:ICPC辽宁省赛复现赛 题目描述: 回文串是反转后与自身完全相同的字符串 比如:"ABA","ACMMCA&qu ...
- js把base64串解析成中文_回文问题终极篇:最小代价构造回文串
学算法认准 labuladong 东哥带你手把手撕力扣? 点击下方卡片即可搜索? 读完本文,你可以去力扣完成第 1312 题「让字符串成为回文串的最少插入次数」,难度 Hard. 回文串就是正着读反着 ...
- 【51nod 1154】 回文串划分
有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b|b|a|a|b ...
- 求最长回文串-从动态规划到马拉车之路(上)
要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串. 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串 ...
最新文章
- NC:菌物组构建---随机性v.确定性、干旱胁迫、宿主筛选、统一动态(郭良栋、杨军点评)
- [VC++入门]指针一
- memcached缓存失效时的高并发访问问题解决
- FreeMarker中文帮助手册API文档,基础入门学习文档
- Android--ViewPager点击按钮切换下一页
- BZOJ2958 序列染色
- MyEclipse上Git的使用(包含导入和导出)
- kgtemp文件转换mp3_amr转换mp3格式文件
- python文件路径过滤器_SUMO入门(八) - 从Python引入TraCI接口
- 通過腳本實現zabbix的安裝
- 随笔写一个简单的爬虫
- 后来,我学会了每做完一件事
- oracle 无法套取,mycat-oracle报java.sql.SQLException: 无法从套接字读取更多的数据
- XP系统出现qq安装包可能被非法改动导致安装失败
- matlab axis函数_又是被Matlab整疯的一天!来学点简单操作!
- Android布局小案例——安卓版计算器
- Matlab无约束优化
- JAVA中关于if结构的相关的练习题
- SolidWorks-旋转凸台的使用
- HDU1870 愚人节的礼物【堆栈+输入输出】