您的位置:首页 > 其它

1154 回文串划分

2015-12-21 21:00 337 查看

萌萌哒的链接

题解:O(n^2)的算法! 用O(n^2)的dp预处理出哪些区间是回文的,然后O(n)求出答案(dp[i]表示前i个字符最小的

回文划分)! 然后预处理还可以再优化,用马拉车来优化可以更快。

代码来了:

//package xdlove_acmer;

import java.text.DecimalFormat;
import java.util.*;
import java.io.*;
import java.math.*;
import java.nio.Buffer;

public class Main {

static InputStream is;
static PrintWriter out;
static String INPUT = "";

static void solve(){
String Str = ns();
int len = Str.length();
char s[] = new char[len + 1];
for(int i = 1; i <= len; i++) {
s[i] = Str.charAt(i - 1);
}
boolean[][] vis = new boolean[len + 1][len + 1];
for(int i = len; i >= 1; i--) {
Arrays.fill(vis[i], false);
vis[i][i] = true;
for(int j = i + 1; j <= len; j++) {
if(s[i] == s[j]) {
if(i == j - 1) vis[i][j] = true;
else if(vis[i + 1][j - 1]) vis[i][j] = true;
}
}
}
int[] dp = new int[len + 1];
for(int i = 1; i <= len; i++) {
dp[i] = dp[i - 1] + 1;
for(int j = 1; j < i; j++) {
if(vis[j][i]) {
dp[i] = Math.min(dp[i], dp[j - 1] + 1);
}
}
}
out.println(dp[len]);
}

public static void main(String[] args) throws Exception {
long S = System.currentTimeMillis();
is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(
INPUT.getBytes());
out = new PrintWriter(System.out);
solve();
out.flush();
long G = System.currentTimeMillis();
tr(G - S + "ms");
}

private static boolean eof() {
if (lenbuf == -1)
return true;
int lptr = ptrbuf;
while (lptr < lenbuf)
if (!isSpaceChar(inbuf[lptr++]))
return false;

try {
is.mark(1000);
while (true) {
int b = is.read();
if (b == -1) {
is.reset();
return true;
} else if (!isSpaceChar(b)) {
is.reset();
return false;
}
}
} catch (IOException e) {
return true;
}
}

private static byte[] inbuf = new byte[1024];
static int lenbuf = 0, ptrbuf = 0;

private static int readByte() {
if (lenbuf == -1)
throw new InputMismatchException();
if (ptrbuf >= lenbuf) {
ptrbuf = 0;
try {
lenbuf = is.read(inbuf);
} catch (IOException e) {
throw new InputMismatchException();
}
if (lenbuf <= 0)
return -1;
}
return inbuf[ptrbuf++];
}

private static boolean isSpaceChar(int c) {
return !(c >= 33 && c <= 126);
}

private static int skip() {
int b;
while ((b = readByte()) != -1 && isSpaceChar(b))
;
return b;
}

private static double nd() {
return Double.parseDouble(ns());
}

private static char nc() {
return (char) skip();
}

private static String ns() {
int b = skip();
StringBuilder sb = new StringBuilder();
while (!(isSpaceChar(b) && b != ' ')) { // when nextLine, (isSpaceChar(b) && b !=
// ' ')
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}

private static char[] ns(int n) {
char[] buf = new char
;
int b = skip(), p = 0;
while (p < n && !(isSpaceChar(b))) {
buf[p++] = (char) b;
b = readByte();
}
return n == p ? buf : Arrays.copyOf(buf, p);
}

private static char[][] nm(int n, int m) {
char[][] map = new char
[];
for (int i = 0; i < n; i++)
map[i] = ns(m);
return map;
}

private static int[] na(int n) {
int[] a = new int
;
for (int i = 0; i < n; i++)
a[i] = ni();
return a;
}

private static int[] copy_int(int a[]) {
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++)
b[i] = a[i];
return b;
}

private static int[] unique(int a[]) {
int nl = 1;
int[] c;
for(int i = 1; i < a.length; i++) {
if(a[i] != a[nl - 1]) a[nl++] = a[i];
}
c = new int[nl];
for(int i = 0; i < nl; i++)
c[i] = a[i];
return c;
}

private static int ni() {
int num = 0, b;
boolean minus = false;
while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
;
if (b == '-') {
minus = true;
b = readByte();
}

while (true) {
if (b >= '0' && b <= '9') {
num = num * 10 + (b - '0');
} else {
return minus ? -num : num;
}
b = readByte();
}
}

private static long nl() {
long num = 0;
int b;
boolean minus = false;
while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
;
if (b == '-') {
minus = true;
b = readByte();
}

while (true) {
if (b >= '0' && b <= '9') {
num = num * 10 + (b - '0');
} else {
return minus ? -num : num;
}
b = readByte();
}
}

private static void tr(Object... o) {
if (INPUT.length() != 0)
System.out.println(Arrays.deepToString(o));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DP