POJ 1159 && HDU 1513 Palindrome(LCS)
2015-08-23 14:59
411 查看
Description
给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串
Input
第一行一个整数n表示字符串长度(n<=5000),第二行一个字符串
Output
输出能使原字符串变为回文字符串最少需要添加几个字符
Sample Input
5
Ab3bd
Sample Output
2
Solution
设原序列S的逆序列为S’,则最少需要补充的字母数=原序列S的长度-S和S’的最长公共子串长度,故转化为LCS问题
注意:本题空间开销较大,需特殊处理,下面给出两种节省空间的方法
1.静态数组(用short int)
2.滚动数组
Code
给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串
Input
第一行一个整数n表示字符串长度(n<=5000),第二行一个字符串
Output
输出能使原字符串变为回文字符串最少需要添加几个字符
Sample Input
5
Ab3bd
Sample Output
2
Solution
设原序列S的逆序列为S’,则最少需要补充的字母数=原序列S的长度-S和S’的最长公共子串长度,故转化为LCS问题
注意:本题空间开销较大,需特殊处理,下面给出两种节省空间的方法
1.静态数组(用short int)
2.滚动数组
Code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define INF (1<<29) #define maxn 5005 char s1[maxn],s2[maxn]; int n; int dp[2][maxn]; int main() { while(~scanf("%d%s",&n,s1)) { for(int i=0;i<n;i++)//求逆串 s2[n-i-1]=s1[i]; memset(dp,0,sizeof(dp));//初始化 for(int i=0;i<n;i++)//LCS for(int j=0;j<n;j++) { if(s1[i]==s2[j]) dp[(i+1)%2][j+1]=dp[i%2][j]+1; else dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]); } cout<<n-dp[n%2] <<endl; } return 0; }
相关文章推荐
- Winsock编程中sin_port设定和抓包数据不一样的问题。
- 洛谷1087 FBI树 解题报告
- 秒杀多线程第一篇——多线程笔试面试题汇总
- Java集合类: Set、List、Map、Queue使用场景梳理
- Javascript跳转页面和打开新窗口等方法
- gson使用教程-翻译2
- Qt5 日志功能
- 黑马程序员——网络编程
- iOS 之CoreLocation反地理编码小Demo输入经纬度得到城市
- Leetcode 234 Palindrome Linked List
- CSS基础知识整理三
- 出入栈顺序可能性
- android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解
- 虚函数、抽象类、接口类
- mui适用场景说明,能不能在普通浏览器里使用,能否用于wap网站
- 【特征匹配】SURF原理与源码解析(二)
- c语言获取符号位整数和浮点
- Spring Named Parameters examples in SimpleJdbcTemplate
- android 内核编译问题汇总
- 第5周工作周报