poj 1159 Palindrome
来源:互联网 发布:大恒视觉软件 编辑:程序博客网 时间:2024/06/16 00:19
题目链接 poj 1159 Palindrome
题意很简单,给你一个字符串,求最少要添加多少个字符串使它变成回文串。
原本是区间dp的题目,但是这里用到了一个小技巧,这个字符与其的逆序字符串的最长公共子序列其实就是这其中最长的回文串,只要n再减去这个最长公共子序列长度就是所求答案了,这里求最长公共子序列长度,dp[5000][5000]会mle所以需要优化一下空间,用滚动数组记录一下就可以了。
Java版:
import java.util.*;import java.math.*;import java.text.*;import java.lang.*;import java.io.*;public class Main{ public static void main(String[] args){ Scanner cin = new Scanner(new BufferedInputStream(System.in)); while (cin.hasNext()){ int n = cin.nextInt(); String p = cin.nextLine(); String ss = cin.nextLine(); char[] s1 = new char[5010]; char[] s2 = new char[5010]; s1 = ss.toCharArray(); for (int i = 0; i < n; i++) { s2[i] = s1[n - 1 - i]; } int[][] dp = new int[2][n + 1]; for (int i = n - 1; i >= 0; i--) { for (int j = n - 1; j >= 0; j--) { if (s1[i] == s2[j]) { dp[i % 2][j] = dp[(i + 1) % 2][j + 1] + 1; } else{ dp[i % 2][j] = Math.max(dp[(i + 1) % 2][j], dp[i % 2][j + 1]); } } } System.out.println(n - dp[0][0]); } }}
C++版:
#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cstring>#include <cmath>using namespace std;int dp[2][5010];char s1[5010];char s2[5010];int main(){ int n; while(cin >> n) { getchar(); scanf("%s", s1); memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; ++i) { s2[i] = s1[n - 1 - i]; } int x = strlen(s1); for (int i = x - 1; i >= 0; --i) { for (int j = x - 1; j >= 0; --j) { if (s1[i] == s2[j]) { dp[i % 2][j] = dp[(i + 1) % 2][j + 1] + 1; } else { dp[i % 2][j] = max(dp[(i + 1) % 2][j], dp[i % 2][j + 1]); } } } printf("%d\n", n - dp[0][0]); }}
0 0
- poj 1159 Palindrome LCS
- poj 1159 Palindrome LCS
- poj 1159 Palindrome
- poj 1159 Palindrome
- dp poj 1159 Palindrome
- poj 1159 Palindrome
- poj 1159 Palindrome
- POJ 1159 Palindrome DP
- Palindrome poj 1159
- Poj 1159 Palindrome
- poj 1159 Palindrome
- poj 1159 Palindrome 【DP】
- poj 1159Palindrome
- poj 1159 Palindrome
- POJ 1159 Palindrome
- POJ 1159 Palindrome
- Poj 1159 Palindrome
- POJ 1159 Palindrome
- OS_CPU_A.ASM cortex-M3 解析
- (抽象)类和接口细节分析
- AngularJS教程
- 利用 thermald和Intel P-state防止笔记本过热
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)
- poj 1159 Palindrome
- 导入数据时报错: MySQL server has gone away
- 将字符串中符合规则的子串取出
- 初识git
- (NO.00002)iOS游戏精灵战争雏形(九)
- 七天使的通讯
- oracle基础
- Linux文件系统分析之一(工具与方法)
- Ubuntu下Openfire的安装