最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码:

#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
*/

最后,姆爷镇楼!!!

简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列的更多相关文章

  1. [LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)

    描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" ...

  2. 51Nod 1092 回文字符串 | 最长公共子序列变形

    求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #de ...

  3. [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)

    最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...

  4. HDU 3068 最长回文 【最长回文子串】

    和上一题一样,不过这题只是要求最长回文子串的长度 在此采用了非常好用的Manacher算法 据说还是O(n) 的效率QAQ 详细用法参考了上篇博客的参考资料,这两天有空学习一下~ Source cod ...

  5. 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> ...

  6. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  7. 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)

    From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...

  8. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  9. 动态规划——最长公共子序列&&最长公共子串

      最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...

  10. 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

随机推荐

  1. java虚拟机(四)--内存溢出、内存泄漏、SOF

    学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...

  2. 微服务网关从零搭建——(二)搭建api网关(不带验证)

    环境准备 创建空的core2.1 api项目  演示使用名称APIGateWay  过程参考上一篇 完成后在appsettings.json 添加节点 "Setting": { & ...

  3. 洛谷P1107 & BZOJ1270 [BJWC2008]雷涛的小猫

    一道DP. 给你一个矩阵里面有很多数,你需要从上往下找到一种跳跃方法使得经过的点的价值之和最大. 具体题面见链接 洛谷P1107 BZOJ1270 很明显是一个二维的DP. #include<b ...

  4. python lambda简易使用

    基本格式 lambda 变量名:函数表达式 ①直接使用 f=lambda x:x**2 f(3) ②设置函数列表 l=[lambda x:x**2, lambda x:x**3, lambda x:x ...

  5. Python利用带权重随机数解决抽奖和游戏爆装备问题

    关于带权随机数 为了帮助理解,先来看三类随机问题的对比: 1.已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管. 实现思路:按行遍历所有记录,约隔n/m条取一个数据即可 2.在1类情况下,还 ...

  6. poj 3253 Fence Repair(priority_queue)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 40465   Accepted: 13229 De ...

  7. python整数转ASCII码

    # *-* coding:utf-8 *-* import binascii data = [1441465642, 251096121, -870437532, -944322827, 647240 ...

  8. noip模拟赛 立方数

    题目描述LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数.现在给定一个数P,LYK想要知道这个数是不是立方数.当然你有可 ...

  9. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  10. Linux下汇编语言学习笔记35 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...