Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 56312 | Accepted: 19468 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
该题的大意是给你一个字符串,最少增加多少个字符能把它变成回文串,其实不是那么难,只要用该字符串的总长度减去该字符串正向与反向最长的公共子序列的差,即为所求的值。
刚开始定义<span style="color:#ff0000;">int x[5005][5005];提交时超内存,后来改为short型在(二字节),在poj上提交时过了,在杭电上提交时,还是超内存,把short型改为char型,但是提交是错了,原来char是一字节,最大能存的数是255<img alt="尴尬" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif" /><img alt="惊讶" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/ohmy.gif" /><img alt="安静" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/quiet.gif" /><img alt="再见" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/bye.gif" /></span>
这个代码只能在poj系统上能过,在hdoj上不能过,因为在杭电上超内存。
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b char a[5005],b[5005]; short x[5005][5005]; int main() { int i,j,k,n; while(scanf("%d%s",&n,a)!=EOF) { int len=strlen(a); j=0; for(i=n-1;i>=0;i--) b[j++]=a[i]; memset(x,0,sizeof(0)); for(i=1;i<=len;i++) { for(j=1;j<=len;j++) { if(a[i-1]==b[j-1]) x[i][j]=x[i-1][j-1]+1; else x[i][j]=max(x[i][j-1],x[i-1][j]); } } //int temp=-'0'; printf("%d\n",len-x[len][len]); } return 0; }
再提供一个代码,在两个系统上都能ac
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b char a[5019],b[5019]; int x[3][5019]; int main() { int i,j,k,n; while(scanf("%d%s",&n,a)!=EOF) { j=0; for(i=n-1;i>=0;i--) b[j++]=a[i]; memset(x,0,sizeof(x)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i-1]==b[j-1]) x[i%2][j]=x[(i-1)%2][j-1]+1; else x[i%2][j]=max(x[i%2][j-1],x[(i-1)%2][j]); } } printf("%d\n",n-x[n%2][n]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/l15738519366/article/details/47403761