简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列
最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码:
#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 ...
随机推荐
- 07C语言程序语句
C语言程序语句 判断语句 if(表达式) {语句} #include <stdio.h> int main(){ printf("请输入2个数字:"); int a,b ...
- BZOJ 1176: [Balkan2007]Mokia KDtree
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...
- yii 在lnmp下访问问题
lnmp大坑 /usr/local/nginx/conf/fastcgi.conf 文件里面
- 模板—AC自动机
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct ...
- SIMD学习 -- 用SSE2指令作点乘和累加计算
这几天在做学校的一个学习小项目,需要用到SIMD指令计算提速.也是第一次碰这个,看了一些资料和代码,模仿着写了两个函数. void sse_mul_float(float *A, float *B, ...
- linux下Mongodb集群搭建:分片+副本集
三台服务器 192.168.1.40/41/42 安装包 mongodb-linux-x86_64-amazon2-4.0.1.tgz 服务规划 服务器40 服务器41 服务器42 mongo ...
- 原生js实现三个按钮绑定三个计时器,点击其中一个按钮,开启当前计时器,另外另个不开启
今天在某个前端交流群,有个小伙伴问了一个小功能,自己想了一下,代码如下,可以实现基本功能: 下面是html结构 <div id="demo"> <input ty ...
- Java基础学习总结(87)——坚持写Java等技术类博客的好处
1.加深对技术点的理解 每天写博客,可以加深对技术点的理解,假如工作中,对某个技术点运用的不熟,当你通过博客的形式写出来,这个过程中,遇到不懂的知识点,你就会查阅相关的资料,弄明白他. 2.自己日后用 ...
- noip模拟赛 花
[问题描述]商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
- 免XML的SpringMVC配置
Servlet 3.0以后,新增了一些注解,使得web.xml可以省略掉.这样配合Spring的JavaConfig就可以实现免xml的项目配置,这里简单搭建一个免XML的SpringMVC.Spri ...