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

浙公网安备 33010602011771号