Description
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 Code
/*
最長公共子序列
DP[i, j] = 0 if i == 0 or j == 0;
DP[i, j] = DP[i - 1][j - 1] + 1; if ch1[i] == ch2[j]
DP[i, j] = max(DP[i - 1][j], DP[i][j - 1]); if ch1[i] != ch2[j]
滾動數組:
dp[i][j]的值只依賴於dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1];
dp[i%2][j]=max(dp[(i-1)%2][j], dp[i%2][j-1]);
注意上面的取餘運算,重複利用這2行數組,數組好象在“滾動”一樣,所以叫滾動數組
*/
#include <iostream>
using namespace std;
#define Max 5002
#define max(a, b) (((a) > (b)) ? (a) : (b))
int main() {
char input[Max], reversal[Max];
int DP[2][Max];
int i, j, len;
while (scanf("%d", &len) !=EOF) {
scanf("%s", input);
for(i = 0; i < len; i++) {
reversal[i] = input[len - 1 - i];
}
memset(DP, 0, sizeof(DP));
for (i = 1; i <= len; i++) {
for (j = 1; j <= len; j++) {
if (input[i - 1] == reversal[j - 1]) {
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", len - DP[len % 2][len]);
}
return 0;
}