POJ 1159 Palindrome
2016-01-15 20:38
337 查看
写这个看似简单的题目才发现自己原来毛都不会(╯‵□′)╯︵┻━┻,加上网上有很多的解析其实讲的都不准确,导致了很多理解上的错误
这道题就是求字符串s和字符串的逆序串s’的最长公共“子序列”,而并非所谓的最长“子串”,一般来说两个子串一定是连续的一段字符,而子序列可以是不连续的……
然后问题来了,怎么求两个子串的最长公共子序列呢,这里用的是动态规划的方法,用数组dp[i][j]来记录两个字符串长度为i和j的前缀的最长公共子序列,然后状态转移方程为如果str1[i] == str2[j]那么dp[i][j] = dp[i-1][j-1]+1,否则dp[i][j] = max(dp[i-1][j],dp[i][j-1])
p.s. 如果要求的是最长公共子串,那么当str1[i]!=str1[j]的时候,令dp[i][j] = 0就可以了,这里dp[i][j]表示的是两子串的最长公共后缀,所有前缀的最长公共后缀就是最长公共子串。
这道题就是求字符串s和字符串的逆序串s’的最长公共“子序列”,而并非所谓的最长“子串”,一般来说两个子串一定是连续的一段字符,而子序列可以是不连续的……
然后问题来了,怎么求两个子串的最长公共子序列呢,这里用的是动态规划的方法,用数组dp[i][j]来记录两个字符串长度为i和j的前缀的最长公共子序列,然后状态转移方程为如果str1[i] == str2[j]那么dp[i][j] = dp[i-1][j-1]+1,否则dp[i][j] = max(dp[i-1][j],dp[i][j-1])
p.s. 如果要求的是最长公共子串,那么当str1[i]!=str1[j]的时候,令dp[i][j] = 0就可以了,这里dp[i][j]表示的是两子串的最长公共后缀,所有前缀的最长公共后缀就是最长公共子串。
#include <iostream> #include <cstdio> #include <string.h> using namespace std; #define maxn 5001 int n; char str1[maxn]={0}; char str2[maxn]={0}; short dp[2][maxn]={0}; int mymax = 0; int main(){ scanf("%d",&n); scanf("%s",&str1); for(int i=0;i<n;++i){ str2[i] = str1[n-i-1]; } str2 = '\0'; //printf("%s\n",str2); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ if(str1[i-1]==str2[j-1]) dp[i%2][j] = dp[(i-1)%2][j-1]+1; else dp[i%2][j] = max(dp[(i-1)%2][j],dp[i%2][j-1]); if(dp[i%2][j]>mymax) mymax = dp[i%2][j]; } } printf("%d\n",n-mymax); //system("pause"); return 0; }
相关文章推荐
- 如何删除软连接文件
- 在 win8 上安装 visual studio2005
- 飞龙的程序员书单 - 组原、OS、网络
- django 学习-15 .Django文件上传(用户注册)
- Java设计模式——策略设计模式——接口的运用
- 设置导航栏透明
- Linux Is Not Matrix——keepalived 实现主备切换
- iOS 【关于几个常用UIColor宏定义】
- 蓝桥杯-基础练习-十六进制转
- cocos2dx 字母数字转换
- CSS基本练习01
- 车辆管理系统之继续自己的任务(八)-----终于可以修改了!
- 关于Java中的数据表示的一些讨论
- Linux基本命令――查看文件内容
- Fast, Scalable Networking in Go with Mangos-nanomsg in go
- Cocos2d-x 3.0目录结构
- 关于iOS启动页面
- Java的基本数据类型和Java的变量类型
- Android之Spinner使用的键值对应和自定义样式问题
- HTML5定稿一周年,谈谈我与HTML5