标签:
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
这道题类似于编辑距离,使用动态规划可解:
用dp(i,j)表示数组从i到j使其成为回文串需要加入的字符个数
那么动态规划方程为
1.min(dp(i+1,j)+1,dp(i,j-1)+1) (a[i]!=a[j])
dp(i,j)={
2.dp(i+1,j-1) (a[i]=a[j])
这道题由于n最大可达5000,因此使用int型的二维数组会超空间,可以把int型改成short型,也可以使用滚动数组。。。。
#include"iostream" #include"cstring" #include"cstdio" using namespace std; const int maxn=5010; char a[maxn]; short dp[2][maxn]; short min(short a1,short a2) { return a1<a2?a1:a2; } int main() { int n; while(scanf("%d",&n)!=EOF) { scanf("%s",a+1); for(int i=n-1;i>=1;i--) { for(int j=i+1;j<=n;j++) { dp[i%2][j]=min(dp[i%2][j-1]+1,dp[(i+1)%2][j]+1); if(a[j]==a[i]) dp[i%2][j]=dp[(i+1)%2][j-1]; } } cout<<dp[1][n]<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/zsyacm666666/p/4725487.html