poj 1159

题意:插入字符来得到回文串,求插入字符最小数目

dp

当c[i]==c[j]

dp[i][j]=dp[i+1][j-1];

否则

dp[i][j]=min(dp[i+1][j],dp[i][j-1]) +1;

用滚动数组做,不用滚动数组时,可以用short int 水过(比较有趣)。

代码:

View Code
#include<iostream>
#include
<fstream>
using namespace std;

char c[5001];
int dp[3][5001];

void read(){
// ifstream cin("in.txt");
int i,j,k;
int n;
cin
>>n;
cin
>>c;

for(k=1;k<n;k++)
{
for(i=0;i+k<n;i++)
{
j
=i+k;
if(c[i]==c[j])
dp[
2][i]=dp[0][i+1];
else
dp[
2][i]=min(dp[1][i],dp[1][i+1])+1;
}
for(i=0;i<n;i++)
dp[
0][i]=dp[1][i];
for(i=0;i<n;i++)
dp[
1][i]=dp[2][i];
}
cout
<<dp[2][0]<<endl;
}

int main(){
read();
return 0;
}

posted on 2011-02-24 17:07  宇宙吾心  阅读(215)  评论(0)    收藏  举报

导航