思路:
dp+滚动数组。
实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 8 int n; 9 string str; 10 int dp[5005][3]; 11 12 int solve() 13 { 14 for (int i = n - 1; i >= 0; i--) 15 { 16 for (int j = i + 1; j < n; j++) 17 { 18 if (str[i] == str[j]) 19 { 20 dp[i & 1][j] = dp[(i + 1) & 1][j - 1]; 21 } 22 else 23 { 24 dp[i & 1][j] = min(dp[i & 1][j - 1], dp[(i + 1) & 1][j]) + 1; 25 } 26 } 27 } 28 return dp[0][n - 1]; 29 } 30 31 int solve2() 32 { 33 for (int j = 2; j <= n; j++) 34 { 35 for (int i = 0; i <= n - j; i++) 36 { 37 if (str[i] == str[i + j - 1]) 38 { 39 dp[i][j % 3] = dp[i + 1][(j - 2) % 3]; 40 } 41 else 42 { 43 dp[i][j % 3] = min(dp[i][(j - 1) % 3], dp[i + 1][(j - 1) % 3]) + 1; 44 } 45 } 46 } 47 return dp[0][n % 3]; 48 } 49 int main() 50 { 51 while (cin >> n >> str) 52 { 53 memset(dp, 0, sizeof(dp)); 54 cout << solve2() << endl; 55 } 56 return 0; 57 }