回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。

例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。

Input


输入一个字符串Str,Str的长度 <= 1000。

Output


输出最少添加多少个字符可以使之变为回文字串。

Input示例

abbc

Output示例

2

题解


很明显的区间dp

\(dp[l][r]=min(dp[l+1][r],dp[l][r-1])+1\)

\(dp[l][r]=dp[l+1][r-1]\;if(a[l]==a[r])\)

练习了下区间dp的两种写法

记忆化搜索

import java.io.*;
import java.util.*; public class Main {
static final int N=(int)1005;
static int dp[][]=new int[N][N];
static char a[]=new char[N];
static int solve(int l,int r) {
if(l>=r) return 0;
if(dp[l][r]!=-1) return dp[l][r];
int ans=0;
if(a[l]==a[r]) ans=solve(l+1,r-1);
else ans=Math.min(solve(l+1,r),solve(l,r-1))+1;
return dp[l][r]=ans;
}
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();
for(int i=0;i<a.length;i++) Arrays.fill(dp[i], -1);
out.println(solve(0,a.length-1));
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());
}
}
}

二维循环

import java.io.*;
import java.util.*; public class Main {
static final int N=(int)1005;
static int dp[][]=new int[N][N];
static char a[]=new char[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();
for(int i=a.length-2;i>=0;i--) {
dp[i][i]=0;
dp[i][i+1]=(a[i]==a[i+1]?0:1);
for(int j=i+2;j<=a.length-1;j++) {
if(a[i]!=a[j])
dp[i][j]=Math.min(dp[i+1][j], dp[i][j-1])+1;
else
dp[i][j]=dp[i+1][j-1];
}
}
out.println(dp[0][a.length-1]);
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());
}
}
}

最新文章

  1. Kafka:主要参数详解(转)
  2. 查看数据库表的数据量和SIZE大小的脚本修正
  3. Rails学习笔记一
  4. Android之Viewpager+Fragment实现懒加载
  5. 使用Spring+Junit4.4进行测试(使用注解)
  6. lnmp
  7. PHP的学习--Traits新特性
  8. poj 3517 约瑟夫环
  9. 如何找出component的注册路径
  10. Security:蠕虫的行为特征描述和工作原理分析
  11. Java EE (5) -- Java EE 6 JavaServer Faces Developer Certified Expert(1z0-896)
  12. HDU 3853 LOOPS 可能性dp(水
  13. CIC and Fir 滤波器的级联
  14. [UWP小白日记-15]在UWP手机端实时限制Textbox的输入
  15. php一些函数及方法...
  16. java集合系列——java集合概述(一)
  17. MongoDB系列四(索引).
  18. 使用Docker安装Oracle数据库
  19. Kubernetes — 控制器
  20. UE4 C++ Tips

热门文章

  1. Counting The Important Pairs CodeChef - TAPAIR
  2. 并查集 HDOJ 1232 畅通工程
  3. usb被占用时,可以用这些方法进行adb无线调试
  4. 150 Evaluate Reverse Polish Notation 逆波兰表达式求值
  5. 【转】java编程思想第20章的注解例子用到的com.sun.mirror的jar包
  6. 基于udp协议的套接字及udp协议粘包问题
  7. Hibernate核心接口和工作原理
  8. IOS的水滴文件效果
  9. Quartz使用一 通过getJobDataMap传递数据
  10. PMP项目管理学习笔记(11)——范围管理之定义范围