Description
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
Source
以下代碼Time超出範圍
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n,i,j,k,m,p[5005],d[5005],max;
char a[5005],c[5005];
while(cin>>n)
{
cin>>a;
j=0;
memset(p,-1,sizeof(p));
memset(d,0,sizeof(d));
for(i=n-1;i>=0;i--)
{
c[i]=a[j];
j++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i]==c[j])
{ max=-1;
//cout<<a[i]<<c[j]<<endl;
for(k=0;k<=i;k++)
{
// cout<<j<<"j"<<k<<"k"<<p[k]<<endl;
if(j>p[k]&&max<d[k])
{
max=d[k];
m=j;
}
}
if(d[i+1]<max+1||(d[i+1]==max+1&&m<p[i+1]))
{
d[i+1]=max+1;
p[i+1]=m;
}
}
//cout<<d[i+1]<<p[i+1]<<endl;
}
}
max=0;
for(i=0;i<=n;i++)
{
if(max<d[i])
{
max=d[i];
}
}
cout<<n-max<<endl;
}
return 0;
}
以下代碼正確
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n,i,j,m,dp[2][5005];
char a[5005];
while(cin>>n)
{
cin>>a;
j=0;
memset(dp,0,sizeof(dp));
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<=n;j++)
{
if(a[i]==a[j])
{
dp[i%2][j]=dp[(i+1)%2][j-1];
}
else
dp[i%2][j]=min(dp[(i+1)%2][j],dp[i%2][j-1])+1;
}
}
cout<<dp[0][n-1]<<endl;
}
return 0;
}