pojPalindrome
思路:
反转题目所给的字符串,并与所给字符串求他们两个的最长公共子序列的值。
总长减去最长公共子序列的值就是最少安插所需的值。
注意:此题直接建二维数组会爆内存,可以使用滚动数组来优化内存!!!
ac代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #define ll long long 7 #define inf 0x3f3f3f3f 8 using namespace std; 9 const int N = 5000 + 10; 10 11 int dp[2][N]; 12 char s1[N], s2[N]; 13 14 int main() { 15 16 int n; 17 cin >> n; 18 scanf("%s", s1 + 1); 19 for (int i = 1; i <= n; i++) { 20 s2[n + 1 - i] = s1[i]; 21 } 22 for (int k = 1, i = 0; k <= n; k++, i ^= 1) { 23 for (int j = 1; j <= n; j++) { 24 dp[i][j] = max(dp[i ^ 1][j], dp[i][j - 1]); 25 if (s1[k] == s2[j]) dp[i][j] = max(dp[i][j], dp[i ^ 1][j - 1] + 1); 26 } 27 } 28 if (n % 2 == 0) { 29 cout << n - dp[1][n] << "\n"; 30 } 31 else { 32 cout << n - dp[0][n] << "\n"; 33 } 34 35 return 0; 36 }