lightoj 1033 - Generating Palindromes LCSor区间DP
2016-03-16 10:48
267 查看
给定一个字符串,问最少添加多少个字符是一个回文串。
以前用区间DP做过,用LCS也做过...
LCS就是把字符串逆置过来...求两串的最长公共子序列,那么len-LCS就是需要添加的字符。
LCS代码:
区间DP就是dp[l][r]代表l,r内需要加多少个字符变为回文串。
那么肯定是由内往外拓展,对于一个区间[l,r]来言,最后添加的字符肯定是l或者r,如果a[l]==a[r],那么最少添加的字符就是dp[l+1][r-1]...否则就是看最后一个是l加的少还是最后一个是r加的少..
以前用区间DP做过,用LCS也做过...
LCS就是把字符串逆置过来...求两串的最长公共子序列,那么len-LCS就是需要添加的字符。
LCS代码:
#include<bits/stdc++.h> using namespace std; #define ll long long char a[120],b[120]; int dp[120][120]; int main() { int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { scanf("%s",a); int len=strlen(a); for(int i=0;i<len;i++) { b[len-i-1]=a[i]; } memset(dp,0,sizeof(dp)); for(int i=1;i<=len;i++) { for(int j=1;j<=len;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]); } } printf("Case %d: %d\n",cas,len-dp[len][len]); } return 0; }
区间DP就是dp[l][r]代表l,r内需要加多少个字符变为回文串。
那么肯定是由内往外拓展,对于一个区间[l,r]来言,最后添加的字符肯定是l或者r,如果a[l]==a[r],那么最少添加的字符就是dp[l+1][r-1]...否则就是看最后一个是l加的少还是最后一个是r加的少..
#include<bits/stdc++.h> using namespace std; #define ll long long char a[120],b[120]; int dp[120][120]; int main() { int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { scanf("%s",a+1); int len=strlen(a+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=len;i++) { for(int l=1;l+i-1<=len;l++) { int r=l+i-1; if(a[l]==a[r]) dp[l][r]=dp[l+1][r-1]; else dp[l][r]=min(dp[l+1][r],dp[l][r-1])+1; } } printf("Case %d: %d\n",cas,dp[1][len]); } return 0; }
相关文章推荐
- 大数据的顶级开源工具
- 卢卡斯队列
- 反编译APK--获取资源文件和java文件
- jQuery插件开发的模式和结构
- 作业2(源程序管理软件与项目管理软件)
- MySQL索引
- 在视图中使用时间
- display: block; -webkit-margin-before: 1em; -webkit-margin-after: 1em; -webkit-margin-start: 0px; -webkit-margin-end: 0px;
- Android——Android studio项目中如何查看R.java文件(转)
- sap hr 人员和组织分配是什么tcode
- 头文件两个类的相互引用
- FSCapture截图小工具和注册码
- Android ListView 异步加载图片
- Struts2+JQuery+Json实例
- java实现接口与继承的关系
- android自定义标题栏时候you cannot combine custom titles with other title
- 21IC菜农研究的HotWC3超级CRC运算器
- 在oracle sql 中处理日期大全
- Android与服务器端数据交互(基于SOAP协议整合android+webservice)
- UILable 的字体加宽,倾斜