简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列
最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码:
#include<iostream>
#include<cstdio>
using namespace std;
char a[],b[];
int dp[][];
int main()
{
int m,n;
cin>>m>>n;
for(int i = ;i <= m;i ++)
{
cin>>a[i];
}
for(int i = ;i <= n;i ++)
cin>>b[i];
for(int i = ;i <= m;i ++)
{
for(int j = ;j <= n;j ++)
{
dp[i][j] = max(dp[i-][j],dp[i][j-]);
if(a[i] == b[j])
dp[i][j] = max(dp[i-][j-]+,dp[i][j]);
}
}
cout<<dp[m][n];
return ;
}
而最长回文子序列和第一道题有什么关系呢?答案其实很简单,只要把原来的字符串倒着保存一遍,然后进行第一题的比较就可以了,代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[],b[];
int dp[][];
int main()
{
int m;
cin>>m;
for(int i = ;i <= m;i ++)
{
cin>>a[i];
}
for(int i = ;i <= m; i++)
b[i] = a[m - i + ];
for(int i = ;i <= m;i ++)
{
for(int j = ;j <= m;j ++)
{
dp[i][j] = max(dp[i-][j],dp[i][j-]);
if(a[i] == b[j])
dp[i][j] = max(dp[i-][j-]+,dp[i][j]);
}
}
cout<<dp[m][m];
return ;
}
有了第二题的启发,最长上升和下降子序列也很好想了,就是把所得的字符串进行一次排序,再进行一次最长公共子序列就可以了,代码如下:
最长上升子序列:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[],b[];
int dp[][];
int main()
{
int m;
cin>>m;
for(int i = ;i <= m;i ++)
{
cin>>a[i];
b[i] = a[i];
}
sort(b + ,b + m +);
for(int i = ;i <= m;i ++)
{
for(int j = ;j <= m;j ++)
{
dp[i][j] = max(dp[i-][j],dp[i][j-]);
if(a[i] == b[j])
dp[i][j] = max(dp[i-][j-]+,dp[i][j]);
}
}
cout<<dp[m][m];
return ;
}
最长下降子序列:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[],b,c[];
int dp[][];
int main()
{
cin>>b;
for(int i = ;i < b; i++)
{
cin>>a[i];
c[i] = a[i];
}
sort(c,c + b);
for(int i = ;i < b; i++)
{
for(int j = b - ;j >= ; j--)
{
dp[i][j] = max(dp[abs(i - )][j],dp[i][j + ]);
if(a[i] == c[j])
dp[i][j] = max(dp[abs(i - )][j + ] + ,dp[i][j]);
}
}
cout<<dp[b - ][];
return ;
}
其实,还有一个nlogn的方法,只不过用了stl中的upper_bound;
用法:下表 = upper_bound(数组开头,数组结尾,查找值) - 数组名
和sort类似
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int a[100],m,d[100],l = 1,k;
memset(d,0,sizeof(d));
cin>>m;
for(int i = 0;i < m;i++)
cin>>a[i];
d[1] = a[1];
for(int i = 1;i < m;i++)
{
if(a[i] >= d[l])
{
l++;
d[l] = a[i];
}
else
{
k = upper_bound(d,d + l,a[i]) - d;
d[k] = a[i];
}
}
cout<<l<<endl;
return 0;
}
/*
5
1 2 3 4 5
*/
最后,姆爷镇楼!!!

简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列的更多相关文章
- [LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)
描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" ...
- 51Nod 1092 回文字符串 | 最长公共子序列变形
求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #de ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- HDU 3068 最长回文 【最长回文子串】
和上一题一样,不过这题只是要求最长回文子串的长度 在此采用了非常好用的Manacher算法 据说还是O(n) 的效率QAQ 详细用法参考了上篇博客的参考资料,这两天有空学习一下~ Source cod ...
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)
From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...
- 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题
一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld" B = & ...
- 动态规划——最长公共子序列&&最长公共子串
最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...
- 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串
1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...
随机推荐
- SpringBoot项目编译后没有xxxmapper.xml文件解决方法
在pom.xml文件中添加如下代码 <build> <plugins> <plugin> <groupId>org.springframework.bo ...
- replace、replaceAll、replaceFirst
replace.replaceAll.replaceFirst这三个函数会java的同学估计都用过,笔者已经用了2年多,可是,我们真的懂他们吗? 概述一下他们三个的用法: · replace(Char ...
- 我的第一次"闭包"应用
结论: 闭包可以当作强类型语言如C++.Java的全局变量使用,非常巧妙 需求: ssm项目,使用pagehelper分页,在写前一页.后一页.第一页.最后一页等页面跳转时,遇到了问题,如果查询全部的 ...
- 2n皇后 - 回溯
题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...
- [Algorithm] 7. Serialize and Deserialize Binary Tree
Description Design an algorithm and write code to serialize and deserialize a binary tree. Writing t ...
- Linux mpstat-显示各个可用CPU的状态
更多linux 性能监测与优化 关注:linux命令大全 mpstat命令指令主要用于多CPU环境下,它显示各个可用CPU的状态系你想.这些信息存放在/proc/stat文件中.在多CPUs系统里,其 ...
- JUnit基本用法
JUnit的一些注意事项: 测试方法必须使用@Test修饰 测试方法必须使用public void进行修饰,不能带参数 一般使用单元测试会新建一个test目录存放测试代码,在生产部署的时候只需要将te ...
- 解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
问题:部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误 初步解决方案: 1,关闭应用程序池 2,关闭网站 3,更新项目 缺点:网站没法访问,部署项目停的时间过长 查询官方文档 ...
- 【Codeforces 356A】Knight Tournament
[链接] 我是链接,点我呀:) [题意] n个人矩形m场比赛 每场比赛由编号为li~ri且之前没有被淘汰的人进行. 已知第i场的winner是xi winner会把这一场其他所有的人都淘汰. 问你n个 ...
- Linux学习总结(21)——CentOS7环境下FTP服务器的安装和配置
1. 安装vsftpd #安装vsftpd yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service # 重启 service vsf ...