1154 回文串划分

来源:互联网 发布:js修改style属性 编辑:程序博客网 时间:2024/06/04 18:07

萌萌哒的链接

题解: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[n];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[n][];for (int i = 0; i < n; i++)map[i] = ns(m);return map;}private static int[] na(int n) {int[] a = new int[n];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));}}


0 0
原创粉丝点击