POJ 1159 Palindrome【LCS+滾動陣列】【水題】
阿新 • • 發佈:2019-01-23
Palindrome
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters
from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.
Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.
Time Limit: 3000MS | Memory Limit: 65536K |
Total Submissions: 63833 | Accepted: 22254 |
Description
A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome.As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
Source
給你一個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為迴文字串。
設原序列S的逆序列為S' ,則最少需要補充的字母數 = 原序列S的長度 — S和S'的最長公共子序列長度
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <string> #include <map> #include <cstring> #define INF 0x3f3f3f3f #define ms(x,y) memset(x,y,sizeof(x)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> P; const int maxn = 5010; const int mod = 998244353; int dp[2][maxn]; int main() { string a, b; int n; cin >> n; cin >> a; b = a; reverse(a.begin(), a.end()); int ans = -INF; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (a[i] == b[j]) dp[i % 2][j] = dp[(i + 1) % 2][j - 1] + 1; else dp[i % 2][j] = max(dp[i % 2][j - 1], dp[(i + 1) % 2][j]); ans = max(ans, dp[i % 2][j]); } } cout << n - ans; return 0; }