DP基础(线性DP)总结
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)总结的更多相关文章
- POJ1163(基础线性DP)
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42547 Accepted: 25721 De ...
- [DP浅析]线性DP初步 - 2 - 单调队列优化
目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- 树形dp基础
今天来给大家讲一下数形dp基础 树形dp常与树上问题(lca.直径.重心)结合起来 而这里只讲最最基础的树上dp 1.选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 动态规划_线性dp
https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
随机推荐
- 剑指offer47:位运算+递归。求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
1 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 2 思路和方法 (1)递归,不能使用if等 ...
- 整体二分(模板二)动态区间第K大
这才是更一般的二分写法--HDU5412 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>// ...
- 前端工程师应该知道的yarn知识
yarn 是在工作中离不开的工具,但在工作中,很多人基本只会使用 yarn install,而且会手动删除 node-modules,或删除 yarn.lock 文件等不规范操作.本文将从一些基础的知 ...
- php.ini中allow_url_fopen和allow_url_include的设置
all_url_include在php 5.2以后添加,安全方便的设置(php的默认设置)为:allow_url_fopen=on;all_url_include=off;allow_url_fope ...
- spark2.0 DataSet操作的一些问题记录
随着新版本的Spark已经逐渐稳定,最近拟将原有框架升级到spark 2.0.还是比较兴奋的,特别是SQL的速度真的快了许多.. 然而,在其中一个操作时却卡住了.主要是dataframe.map操作, ...
- 设置自己的bat运行文件-自己用,随时扩展
start "" "E:\SEST_H5" start "" "C:\Program Files\Sublime Text 3\s ...
- iphone SprintBoard部分私有API总结(不支持iOS8)
本文介绍iOS SrpintBoard框架的部分私有API,具体包括: 获取ios上当前正在运行的所有App的bundle id(不管当前程序是在前台还是后台都可以) 获取ios上当前前台运行的App ...
- SAP CRM和C4C的内容管理(Content Management)
SAP CRM内容管理 SAP CRM使用Attachments这个UI给用户提供内容管理的功能.通过新建按钮可以上传本地文档到CRM系统: 该内容管理支持简单的版本管理功能,用户可点击Check O ...
- 《浏览器工作原理与实践》<02>TCP协议:如何保证页面文件能被完整送达浏览器?
前言: 在衡量 Web 页面性能的时候有一个重要的指标叫“FP(First Paint)”,是指从页面加载到首次开始绘制的时长.这个指标直接影响了用户的跳出率,更快的页面响应意味着更多的 PV.更高的 ...
- linux——目录说明
1) bin -> usr/bin : 这个目录存放最经常使用的命令 2) boot : 这个目录存放启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 3) dev: de ...