DP基础(线性DP)总结

前言:虽然确实有点基础......但凡事得脚踏实地地做,基础不牢,地动山摇,,,嗯!


LIS(最长上升子序列)

dp方程:dp[i]=max{dp[j]+1,a[j]<=a[i]}

复杂度:O(n^2)


LIS优化

法一:数据结构无脑暴力优化

​ 以a[i]为数组下标,从1到a[i]访问最大值,再加一,进行更新

法二:设h[k]表示dp值为k的最长上升子序列的最小值(有点贪心在里面)

​ 显然h[k]>=h[k-1](k>=2),证明:若存在h[k-1]>h[k],则h[k-1]可以从h[k]中转移,故不存在h[k]>=h[k-1]

​ 所以我们可以通过二分查找,找到一个最大的h[k]满足h[k]<=a[i],则dp[i]=k+1

两种方法的复杂度都为O(nlogn)


LCS(最长公共子序列)

dp方程:

dp[i][j]=max{dp[i-1][j-1]+1,a[i]==b[j]}
dp[i][j]=max{dp[i-1][j],dp[i][j-1],a[i]!=b[j]}//若a[i]!=b[j]则说明a[i]或b[j]对于dp值无贡献

复杂度:O(n^2)

优化:嗯......少数有特殊性质的题目可以将LCS转化为优化LIS来做。


LCIS(最长公共上升子序列)

小声bb:最麻烦的来了

先说复杂度O(n*m^2)的吧:

设dp[i][j]表示a序列的前i个数和b序列的前j个数且以b[j]结尾构成的LCIS长度
则若a[i]!=b[j]则需找到一个a[k]与b[j]匹配(1<=k<=i-1),故a[i]对于dp[i][j]的值无贡献,
所以dp[i][j]=dp[i-1][j]
若a[i]=b[j]则a[i]与b[j]匹配,所以dp[i][j]=max{dp[i-1][t],1<=t<=j-1且b[t]<=b[j]}

然后是复杂度O(nmlogm)的:

考虑类似于优化LIS的优化
设h[k]表示dp值为k的LCIS的最后一位b[t]的最小值,显然h[k]也一定满足h[k]>=h[k-1]
故可以通过二分查找来找到最大的h[k]满足h[k]<=b[j],则dp[i][j]=k+1

最后是复杂度O(n*m)的:

我们需要找到b[t]<b[j],我们发现,在dp过程中,外层循环是i,内层循环是j,也就是说对于同一组内层循环来讲,i的值是一定的,而j是从一到n,故我们在循环的过程中,对于同一组内层循环来讲,我们可以记录一个t值使得 dp[i-1][t]的值最大且b[t]<=b[j]
for(int i=1;i<=n;i++)
{
int t=0;
for(int j=1;j<=m;j++)
{
if(a[i]!=b[j])dp[i][j]=dp[i-1][j];
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][t]+1;
}
if(a[i]>b[j]&&dp[i-1][j]>dp[i-1][t])t=j;
}
}

DP基础(线性DP)总结的更多相关文章

  1. POJ1163(基础线性DP)

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42547   Accepted: 25721 De ...

  2. [DP浅析]线性DP初步 - 2 - 单调队列优化

    目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...

  3. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  4. 树形dp基础

    今天来给大家讲一下数形dp基础 树形dp常与树上问题(lca.直径.重心)结合起来 而这里只讲最最基础的树上dp 1.选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程 ...

  5. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  6. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  7. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...

  8. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  9. 非常完整的线性DP及记忆化搜索讲义

    基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...

随机推荐

  1. LeetCode 61——旋转链表(JAVA)

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...

  2. nginx日志模块、事件模块

    日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...

  3. MySQL 数据库面试题

    原文出处:https://juejin.im/post/5a9ca0d6518825555c1d1acd 作者:Java3y 本文在原文基础上进行修改,而且没有特定针对MySQL. 一.存储过程(以及 ...

  4. 《深入理解 Java 虚拟机》学习 -- Java 内存模型

    <深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...

  5. Jmeter4.0---- 测试数据说明(17)

    1.说明 jmeter工具对于请求的测试结果,有多种形式展现,但是数据比较难懂,现在针对不同的展现做具体的说明. 2.监听器 (一)图形结果 (1)样本数目:总共发到服务器的请求数 (2)最新样本:服 ...

  6. ASP.NET 中的 Session 怎么正确使用

    Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...

  7. js重点——作用域——简单介绍(一)

    一.作用域 定义:在js中,作用域为变量,对象,函数可访问的一个范围. 分类:全局作用域和局部作用域 全局作用域:全局代表了整个文档document,变量或者函数在函数外面声明,那它的就是全局变量和全 ...

  8. # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)

    总结: 量纲化(归一化,标准化) 缺失值处理(补0.均值.中值.众数.自定义) 编码/哑变量:忽略数字中自带数学性质(文字->数值类型) 连续特征离散化(二值化/分箱处理)

  9. OpenCl入门getting-started-with-opencl-and-gpu-computing

    原文来自于:getting-started-with-opencl-and-gpu-computing/ 对整个程序的注释:http://www.kimicat.com/opencl-1/opencl ...

  10. 002.MVC开发方法和步骤--用一个简单的加法程序来演示

    MVC的工作原理: 注:ASP.NET MVC中的url 特殊:构成 http//....../控制器名/方法名 默认: 1.Url请求直接来到Controller中 2.Controller从Mod ...