通过这个题学到了很多东西,尤其是滚动数组的优化太精彩了。下面先写上我对应用滚动数组的一些想法。先看下面的动态转移方程,dp[i][j]=max(dp[i-1][j],dp[i][j-1]),我们首先能看出i-1与i的奇偶性是一定不同,所以我们模2之后的结果是不变的,也就是dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1])的效果和原来的效果是一样的。下面看代码。空间复杂度就降下来了,太棒了。
#include<iostream>
#include<string>
using namespace std;
char a[5005],b[5005];
int dp[2][5005];
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int n,i,j;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
cin>>a[i];
b[n-i+1]=a[i];
}
for(i=0;i<=n;i++)
{
dp[i%2][0]=0;
dp[0][i]=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i]==b[j])
dp[i%2][j]=dp[(i-1)%2][j-1]+1;
else dp[i%2][j]=maxi(dp[(i-1)%2][j],dp[i%2][j-1]);
}
cout<<n-dp[n%2][n]<<endl;
}
return 0;
}