题目描述

给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串。问最少可以分割成多少个。 字符串长度不超过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】划分成回文串相关推荐

  1. UVA11584 划分成回文串 Partitioning by Palindromes(线性DP划分+DP判断回文串)

    整理的算法模板合集: ACM模板 依旧是线性DP 我们使用闫氏DP分析法 总体DP转移的时间复杂度为O(n2)O(n^2)O(n2). 但是这里牵扯到判断 i\tt ii 到 j\tt jj 是否为回 ...

  2. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

  3. 【132】求把字符串分割成回文串的最少切分次数

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...

  4. 动态规划之回文串问题

    一.DP求回文串[POJ-1159] A palindrome is a symmetrical string, that is, a string read identically from lef ...

  5. poj3280 Cheapest Palindrome(回文串区间dp)

    https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...

  6. 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II

    LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...

  7. 2020年ICPC辽宁省赛- 最长回文串(Java)

    最长回文串 题目描述 算法分析 代码展示 题目描述 链接:ICPC辽宁省赛复现赛 题目描述: 回文串是反转后与自身完全相同的字符串 比如:"ABA","ACMMCA&qu ...

  8. js把base64串解析成中文_回文问题终极篇:最小代价构造回文串

    学算法认准 labuladong 东哥带你手把手撕力扣? 点击下方卡片即可搜索? 读完本文,你可以去力扣完成第 1312 题「让字符串成为回文串的最少插入次数」,难度 Hard. 回文串就是正着读反着 ...

  9. 【51nod 1154】 回文串划分

    有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b|b|a|a|b ...

  10. 求最长回文串-从动态规划到马拉车之路(上)

    要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串. 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串 ...

最新文章

  1. NC:菌物组构建---随机性v.确定性、干旱胁迫、宿主筛选、统一动态(郭良栋、杨军点评)
  2. [VC++入门]指针一
  3. memcached缓存失效时的高并发访问问题解决
  4. FreeMarker中文帮助手册API文档,基础入门学习文档
  5. Android--ViewPager点击按钮切换下一页
  6. BZOJ2958 序列染色
  7. MyEclipse上Git的使用(包含导入和导出)
  8. kgtemp文件转换mp3_amr转换mp3格式文件
  9. python文件路径过滤器_SUMO入门(八) - 从Python引入TraCI接口
  10. 通過腳本實現zabbix的安裝
  11. 随笔写一个简单的爬虫
  12. 后来,我学会了每做完一件事
  13. oracle 无法套取,mycat-oracle报java.sql.SQLException: 无法从套接字读取更多的数据
  14. XP系统出现qq安装包可能被非法改动导致安装失败
  15. matlab axis函数_又是被Matlab整疯的一天!来学点简单操作!
  16. Android布局小案例——安卓版计算器
  17. Matlab无约束优化
  18. JAVA中关于if结构的相关的练习题
  19. SolidWorks-旋转凸台的使用
  20. HDU1870 愚人节的礼物【堆栈+输入输出】

热门文章

  1. 使用scrapy框架爬取携程旅行数据
  2. CSDN 社区大趴-北京站 圆满结束
  3. sql server作业实现数据同步
  4. Solidity节省GAS的方法
  5. vb与c语言数组传递,在VB中调用C/C++语言编写的dll,数组参数的传递
  6. java基础-File类与IO流
  7. 交换机,路由器接口类型
  8. 各种Normailization(BN,LN,IN,CIN,AdaIN,SPADE,SEAN)
  9. android Settings之辅助功能
  10. 表白神器!程序员七夕情人节源码合集