有一个字符串S,求S最少可以被划分为多少个回文串。
例如:abbaabaa,有多种划分方式。

a|bb|aabaa - 3 个回文串
a|bb|a|aba|a - 5 个回文串
a|b|b|a|a|b|a|a - 8 个回文串

其中第1种划分方式的划分数量最少。

Input


输入字符串S(S的长度<= 5000)。

Output


输出最少的划分数量。

Input示例

abbaabaa

Output示例

3

题解


设dp[i]为考虑(i~len)的最少分割,那么
\(dp[i]=min(dp[i],dp[j+1]+1)\;if(i,j)为回文串\)
这个可以倒推也可以正推,至于求回文串
if a[i]==a[j] and (i-1,j+1)是回文串
then (i,j)是回文串,这个是\(O(n^2)\),与dp方程同级,就放在一起转移吧。

参考代码

import java.io.*;
import java.util.*;public class Main {static final int N=(int)5005;static int dp[]=new int[N];static char a[]=new char[N];static boolean p[][]=new boolean[N][N];public static void main(String[] args) {  InputStream sys=System.in;InputReader in=new InputReader(sys);PrintWriter out=new PrintWriter(System.out);a=in.next().toCharArray();dp[a.length]=0;for(int i=a.length-1;i>=0;i--) {dp[i]=Integer.MAX_VALUE;for(int j=i;j<=a.length-1;j++) {if(a[i]==a[j]&&(j-i<2||p[i+1][j-1])) {p[i][j]=true;dp[i]=Math.min(dp[i], dp[j+1]+1);}}}out.println(dp[0]);out.flush();}static class InputReader {public BufferedReader reader;public StringTokenizer tokenizer;public InputReader(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}}
}

转载于:https://www.cnblogs.com/zsyacm666666/p/7348927.html

【51nod 1154】 回文串划分相关推荐

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

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

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

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

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

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

  4. 51Nod 1092 回文字符串(LCS + dp)

    51Nod 1092 数据结构暑假作业上出现的一题,学习了一下相关算法之后,找到了oj测试能AC. 1.回文串是一种中心对称的结构,这道题可以转变为求最长回文子序列长度的题目.(子序列:可以不连续) ...

  5. 回文串(algorithm)

    题目(回文子串的个数) - 中心扩展: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序 ...

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

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

  7. 伍六七带你学算法 入门篇-最长回文串

    力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...

  8. LeetCode简单题之最长回文串

    题目 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 . 在构造过程中,请注意 区分大小写 .比如 "Aa" 不能当做一个回文字符串. 示例 ...

  9. usaco Calf Flac(O(n)时间求回文串长度)

    好高兴,为数不多的我没看题解的题·,我用的是O(n)时间求回文串长度的算法算法在我上一篇博客. 然后就是注意细节了. /* ID:jinbo wu TASK: calfflac LANG:C++ */ ...

最新文章

  1. hadoop 实战练习_hadoop入门到实战(2)hive经典练习题
  2. int转base64编码
  3. WEB前端 vue学习二 组件之间的数据传递
  4. Hive引擎改为Tez笔记
  5. linux系统调试网络,linux系统命令(网络相关的调试命令)
  6. 解说linux下proc文件系统
  7. 创新性应用深度学习,IBM在语音识别领域取得了里程碑式突破
  8. docker 日志_解决docker容器日志导致主机磁盘空间满了的情况
  9. mysql 5.5 升级_Windows下MySQL5.5升级MySQL5.7
  10. 20190110-生成密码以及简易密码强度检查
  11. ES6 class继承
  12. Python从头开始的演变策略
  13. Eplan 各版本 软件 百度网盘 永久链接
  14. 人脸识别考勤机选型验收标准
  15. 【教育教学资源】教育资讯、教学功能、当老师、或者补习班给学生的资料
  16. php 查看文件信息,文件信息查看
  17. 初探DirectShow
  18. 兼容iOS 10 _升级xcode8_适配(一)
  19. 山西大同大学计算机科学与技术在哪个校区,山西大同大学有几个校区及校区地址 哪...
  20. java解析Excel

热门文章

  1. @Controller @RestController
  2. Linux安装JDK完整步骤
  3. android 6.0获取蓝牙权限
  4. 解决切换场景时NGUI图集资源未释放的问题
  5. 15款精美的 WordPress 电子商务网站模板
  6. 【使用C语言的7的步骤】
  7. python利用myqr库生成二维码
  8. Python学习笔记之用户输入
  9. 苹果id是什么格式的_iTunes Converter mac(音频格式转换工具)
  10. w我的页面显示服务器错误,vue项目,在本地打开一个页面正常,部署到服务器就会出现 404Not Found 求解?...