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

#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. 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

    package algorithms; /* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public class ListNode { int val; ListNo ...

  2. A6. JVM 垃圾回收算法(GC 算法)

    [概述] 常见的垃圾回收算法有:标记-清除算法.复制算法.标记-整理算法.分代收集算法. [标记-清除算法] 标记-清除算法是最基础的收集算法,如同它的名字一样,算法分为 “标记” 和 “清除” 两个 ...

  3. outflow Boundary Condition in FLuent

    assumption: flow is imcompressible, fully developed, $\partial \phi / \partial X =0$, where is X is ...

  4. String HDU 5672(双指针)

    String HDU 5672(双指针) 传送门 题意:一个字符串中找到所有拥有不少于k个不同的字符的子串. import java.io.*; import java.util.*; public ...

  5. 前端面试题总结一(js变量和函数声明提前相关)

    好久没有更新博客了,^_^写写博客吧!下面是我总结的一些面试题,希望对大家有所帮助 (1)题目如下: alert(a)  var a=1  function a(){    alert(a) } 好多 ...

  6. Java基础学习总结(82)——Java泛型实例教程

    1.为什么需要泛型 泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇将立足于代码介绍.总结了关于泛型的知识.希望能给你带来一些帮助. 先看下面的代码: List list = ...

  7. cocos2d 接 android sdk 的一个小坑 关于armbeabi 和 armbeabi-v7a

    cocos2d 接 android sdk 的时候,有些sdk会要求外链到某个工程中,而这个工程的lib文件夹里会包含armbeabi 和 armbeabi-v7a这两个文件夹,如果直接打包会闪退.只 ...

  8. Bugzilla 系统企业应用案例

    目录 一. 概述: - 4 - 二. 目的 - 4 - 三. 执行原则 - 4 - 四. 管理办法 - 4 - 五. BUG处理流程图 - 5 - 六. 主要职责 - 6 - 七. 需求类问题处理 - ...

  9. Ubuntu 16.04安装Gufw防火墙(转)

    继上一篇文章http://www.cnblogs.com/EasonJim/p/6851241.html讲解的UFW防火墙是没有界面的,下面将介绍在Gufw的GUI配置功能. Ubuntu简化了ipt ...

  10. Hadoop 究竟能做什么?

    http://hi.baidu.com/jiuxiaoyao/item/ff0a19e5b09a953a87d9def3 现在好像大家都在讲 大数据 云计算 hadopp .那么hadoop究竟能做些 ...