杭电-1513Palindrome(LCS+滚动数组)
2015-11-12 17:05
323 查看
Palindrome
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4344 Accepted Submission(s): 1482
[align=left]Problem Description[/align]
A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted
into the string in order to obtain a palindrome.
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.
[align=left]Input[/align]
Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from
'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.
[align=left]Output[/align]
Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.
[align=left]Sample Input[/align]
5 Ab3bd
[align=left]Sample Output[/align]
2
明显的LCS,但是要用到二位数组dp[5000][5000]会超内存,联系到每次的计算只与上次有关,所以可以用到滚动数组!
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[2][5500]; char s1[5500],s2[5500]; int main() { int m,n,i,j; while(scanf("%d",&n)!=EOF) { scanf("%s",s1); int t=0; for(i=n-1;i>=0;i--) s2[t++]=s1[i]; s2 ='\0'; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { int x=i%2; int y=1-x; if(s1[i-1]==s2[j-1]) dp[x][j]=dp[y][j-1]+1; else dp[x][j]=max(dp[y][j],dp[x][j-1]); } } printf("%d\n",n-(dp[n%2] )); } return 0; }
相关文章推荐
- Haskell的WriterMonad解构
- 单例类
- oc命名规范
- 没有继承性的属性
- 缩写
- web.xml加载顺序
- 实验二 作业调度模拟实验
- MIPS交叉环境的建立
- javascript(EcmaScript 5)的严格模式
- 关闭activity相关的
- 安卓开发新技能Get丨常用必备小工具汇总
- rk3288_lubuntu 定制问题
- iOS面试2
- 自定义view之圆形头像(2种实现方式)
- IOS如何选择图片加载方式:imageNamed和imageWithContentsOfFile的区别
- Ubuntu14.04安装chrome
- 我觉得比较好的资源站
- 通过RS232发送和接收短信(三)
- 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
- 通过RS232发送和接收短信(三)