pku 1159 Palindrome(DP)

 

题目大意:给一个字符串,在其中恰当位置插入几个字符后,使该串成为回文 ,问最少要插入几个字符。

分析:相当简单的 DP count[i][j] 表示子串(第 i 个字符到第 j 个字符)变成回文后有多少个字符,数组 sym 存储原串。当 sym[i]==sym[j] 时, count[i][j]=count[i+1][j-1]+2 。否则, count[i][j]=min(count[i+1][j],count[i][j-1])+2

 

虽然我的代码过了,但空间和时间消耗都比较大,搞不懂那些 0ms 的是怎么做的,知道的大牛过来指点一下。

 

#include <iostream> using namespace std; #define Min(x,y) (x<y?x:y) short count[5005][5005]; char sym[5005]; int n; void DP(); int main() { scanf("%d",&n); scanf("%s",sym+1); for(int i=1;i<=n;i++) { count[i][i-1]=0; count[i][i]=1; } DP(); printf("%hd",count[1][n]-n); return 0; } void DP() { for(int i=1;i<n;i++) { for(int j=1;j+i<=n;j++) { if(sym[j]==sym[j+i]) { count[j][j+i]=count[j+1][j+i-1]+2; continue; } count[j][j+i]=Min(count[j+1][j+i],count[j][j+i-1])+2; } } }  

 

你可能感兴趣的:(pku 1159 Palindrome(DP))