Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题目大意:求插入最少的字符使得串为palindeome(回文串)。
解法一:遇到问题要剖析其原型,此题就是正序和逆序的LCS,结果来n-commenlength.
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define LL long long #define inf 0x3f3f3f3f using namespace std; short dp[5001][5001]; char a[5005],b[5005]; int main() { int n,m,x,k,i,j; int cla; while(~scanf("%d",&n)) { int s=0; dp[0][0]=0;<span id="transmark"></span> scanf("%s",a); for(i=n-1;i>=0;i--) b[s++]=a[i]; b[s]='\0'; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } cout<<n-dp[n][n]<<endl; } return 0; }
解法二:利用滚动数组来减少空间的开支。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #include<queue> #include<map> #include<stack> #define L1 long long #define L2 int #define inf 0x3f3f3f3f using namespace std; const int m1=1001000; const int m2=1010; L2 dp[3][5010],a[100010]; char s[5010],s1[5010]; int main() { int n,m,i,j,k; while(~scanf("%d",&n)){ getchar(); scanf("%s",s+1);int t=1; for(i=n;i>=1;--i){ s1[t++]=s[i]; } s1[t]='\0'; memset(dp,0,sizeof(dp)); for(i=1;i<=n;++i){ for(j=1;j<=n;++j){ if(s[i]==s1[j]){ dp[1][j]=dp[0][j-1]+1; } else{ dp[1][j]=max(dp[0][j],dp[1][j-1]); } } for(j=1;j<=n;j++){ dp[0][j]=dp[1][j]; } } printf("%d\n",n-dp[0][n]); } return 0; }