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;
}

posted on 2011-05-06 19:07  _Clarence  阅读(116)  评论(0编辑  收藏  举报

导航