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;
}
浙公网安备 33010602011771号