ACM PKU 1159 Palindrome http://acm.pku.edu.cn/JudgeOnline/problem?id=1159
原问题为求回文数需要插入的最少字母,转化为求最长公共子序列!经典的DP问题,算法有固定的模板,
动态规划+滚动数组解决问题:
#include <iostream> using namespace std; char str[5001]; char un_str[5001]; int len[2][5001]; int main () { int n; cin >> n; int i = 1; int j = n; while (i <= n) { char temp; cin >> temp; str[i] = temp; un_str[j] = temp; i++; j--; } memset(len,0,sizeof(len)); int k = 1; for(i = 1; i <= n; i++) { for (j = 1; j <= n;j++) { if (str[i] == un_str[j]) len[k][j] = len[1 - k][j-1]+1; else if (len[1 - k][j] >=len[k][j-1]) len[k][j] = len[1 - k][j]; else len[k][j] = len[k][j-1]; } k = 1 - k; } cout <<n - len[1 - k][n]<<endl; return 0; }