博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【51nod 1154】 回文串划分
阅读量:7210 次
发布时间:2019-06-29

本文共 1949 字,大约阅读时间需要 6 分钟。


有一个字符串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

你可能感兴趣的文章
简单账表二次开发添加自定义字段
查看>>
又找到安装Python第三方模块的好法子
查看>>
如何安装ioncube扩展对PHP代码加密
查看>>
自定义报表是这样实现的
查看>>
How to Convert Dynamic Disk to Basic Disk without Losing Data?
查看>>
Tomcat的安装
查看>>
Script:ASM修复脚本,寻找LISTHEAD和Kfed源数据
查看>>
ubuntu开机进入字符界面方法
查看>>
硬盘常见故障
查看>>
python 自动下载网站相关附件
查看>>
centos 6.5安装视频解码器
查看>>
Freeradius, 执行 radtest, 出现错误
查看>>
Android启动出现白屏的解决办法(theme)
查看>>
设计模式之单例设计模式
查看>>
LVS DR模型详解
查看>>
linux 源码安装Rabbitmq
查看>>
python 练习-登录接口
查看>>
pt-heartbeat 监测RDS延迟
查看>>
使用IDEA导入工程时无反映的问题处理
查看>>
python selenium爬取kuku漫画
查看>>