poj 1159 Palindrome(dp+滚动数组)
2016-03-14 13:55
375 查看
题意:给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
思路:求原串与其逆串的最长公共子序列,然后用串长减去最长公共子序列的长度就是要添加的最少的字符数就是需要添加的字符数。另外还需注意的是字符串长度最长Max为5000,如果用数组maxlen[Max][Max],那么内存会超出。所以引进滚动数组,只需要定义maxlen[2][Max]就可以把问题解决了。
参考资料:
/article/6021412.html
思路:求原串与其逆串的最长公共子序列,然后用串长减去最长公共子序列的长度就是要添加的最少的字符数就是需要添加的字符数。另外还需注意的是字符串长度最长Max为5000,如果用数组maxlen[Max][Max],那么内存会超出。所以引进滚动数组,只需要定义maxlen[2][Max]就可以把问题解决了。
参考资料:
/article/6021412.html
#include<iostream> #include<cstring> using namespace std; #define Max 5005 char str1[Max],str2[Max]; int maxlen[2][Max]; int main() { int n,i,j; while(cin>>n) { for(i=1; i<=n; i++) cin>>str1[i]; str1[n+1]='\0'; for(i=1; i<=n; i++) //字符串str1的逆串 str2[i]=str1[n-i+1]; memset(maxlen,0,sizeof(maxlen));//初始化 int e=0; for(i=1; i<=n; i++) //用动态规划求解 { e=1-e;//用滚动数组,保证内存不会超出 for(j=0; j<=n; j++) { if(str1[i]==str2[j]) maxlen[e][j]=maxlen[1-e][j-1]+1; else { int len1=maxlen[e][j-1]; int len2=maxlen[1-e][j]; if(len1>len2) maxlen[e][j]=len1; else maxlen[e][j]=len2; } } } cout<<n-maxlen[e] <<endl; } return 0; }
相关文章推荐
- 三个数gcd与lcm
- UrlBasedViewResolver与InternalResourceViewResolver
- JBoss 系列九十九:Rest WebService jBPM 6 集成演示样例
- IOS 上架要求视频
- 单钥密码体制和双钥密码体制有什么区别?
- Swagger与SpringMVC项目整合
- javascript window.name是什么?
- 5、在MyJDBCUtils中,增加根据User实体的id,去查找User的方法
- 翻翻git之---基于universalimageloader实现的图片加载控件BlurImageView
- AndroidStudio配置SVN以及使用代码管理
- 翻翻git之---基于universalimageloader实现的图片加载控件BlurImageView
- leetcode 69. Sqrt(x)
- SIOCSIFFLAGS: Operation not possible due to RF-kill
- 百度地图开发 android App 数字签名(SHA1)获取办法
- 前端分页效果
- https
- 欢迎使用CSDN-markdown编辑器
- 活动的生存周期
- WD mycloud 加载过慢的时候注意事项
- wmap安装过程的问题解决