Codeforces - 702A - Maximum Increase - 简单dp
DP的学习计划,刷 https://codeforces.com/problemset?order=BY_RATING_ASC&tags=dp
遇到了这道题 https://codeforces.com/problemset/problem/702/A
以为是最长上升子序列(Longest Increasomg Subsequence)的模板题,发现自己不会做
记录一下大概的思路:
\(O(n^2)\) 的算法:
- \(L[i]\) 选择 \(A[i]\) 为结尾的LIS的长度
- \(P[i]\) 选择 \(A[i]\) 为结尾的LIS的倒数第二个元素的Position(可以用来复现整个LIS)
- 临时变量 \(k\) ,表示 \(A[i]\) 计算时找到的前面最长的LIS的位置
- 对于每个 \(A[i]\) ,遍历它前面的每个 \(A[j]\) ,记录所有满足 \(A[j]<A[i]\) (可以把 \(A[i]\) 接在后面)且 \(L[j]>L[k]\) (更长的子序列)
- \(L[i]=L[k]+1\)
- \(P[i]=k\)
\(O(nlogn)\) 的算法:
- \(L[i]\) 长度为\(i+1\) 的IS的末位元素的最小值
- \(length\) 前 \(i\) 个元素构成的LIS的长度
- 升序遍历 \(i\),故 \(length\) 非降,而且构造的过程中 \(L\) 数组是递增的
- 如果 \(L[length-1]<A[i]\) ( \(A[i]\) 可以接在当前最长的(长度为 \(length\) 的)LIS后面),则 \(L[length++]=A[i]\)
- 否则在已确定的 \(L[0]~L[length]\) 中(长度为 \(1\) 到 \(length\) 闭区间的LIS的最末元素)二分找到能更新的位置并更新 $*lower\_bound(L,L+length,A[i])=A[i]$
#include<bits/stdc++.h>
using namespace std;
#define ll long long int A[];
int L[]; int lis(){
L[]=A[];
int length=;
for(int i=;i<n;i++){
if(L[length-]<A[i]){
L[length++]=A[i];
}
else{
*lower_bound(L,L+length,A[i])=A[i];
//1 7 2 5,已有序列1 7,lower_bound(2)得到7,可以把长度为2的LIS的末尾换成2
}
}
return length;
} int main(){
int n;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&A[i]);
}
printf("%d\n",lis()); }
复原的时候也很简单,把$L[0]~L[length-1]$全部输出就可以了
但是最后我发现这个702A并不是LIS,因为他不是子序列而是子串!
2019-01-16
Codeforces - 702A - Maximum Increase - 简单dp的更多相关文章
- CodeForces 702A Maximum Increase
简单$dp$. 如果$a[i]>a[i-1]$,那么$dp[i]=dp[i-1]+1$.否则,$dp[i]=1$.答案为$dp[i]$中的最大值. #pragma comment(linker, ...
- Codeforces 702A Maximum Increase(dp)
题目链接:http://codeforces.com/problemset/problem/702/A 题意: 给你N个数,a[0], a[1], a[2], ....., a[n-1],让你找出最长 ...
- Codeforces 1108D - Diverse Garland - [简单DP]
题目链接:http://codeforces.com/problemset/problem/1108/D time limit per test 1 secondmemory limit per te ...
- Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学
https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...
- Codeforces - 474D - Flowers - 构造 - 简单dp
https://codeforces.com/problemset/problem/474/D 这道题挺好的,思路是这样. 我们要找一个01串,其中0的段要被划分为若干个连续k的0. 我们设想一个长度 ...
- Codeforces - 909C - Python Indentation - 简单dp
http://codeforces.com/problemset/problem/909/C 好像以前做过,但是当时没做出来,看了题解也不太懂. 一开始以为只有上面的for有了循环体,这里的state ...
- Codeforces 375B Maximum Submatrix 2 (DP)
<题目链接> 题目大意:给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积. #include <bits/stdc++.h> using namespa ...
- Codeforces 886E Maximum Element 组合数学 + dp
我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程 dp[ i ] = sum(dp[ i - j - ...
- Codeforces 332B Maximum Absurdity(DP+前缀和处理)
题目链接:http://codeforces.com/problemset/problem/332/B 题目大意:给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两个 ...
随机推荐
- vim中末行去掉^M
在Ubuntu系统中打开文件,发现文件中每一个末行都有^M,我们要做的是知道这一个无关的字符是什么作用,然后删除掉这一个无关的字符. 工具/原料 ubuntu操作系统 Vim编辑器 方法/步骤 ...
- JBoss 6.1安装配置问题
一,配置环境变量 JBOSS_HOME:配置到解压文件的根文件夹下: classpath跟JAVA_HOME:配置的解压文件夹\bin文件夹以下: 二,訪问端口号 因为我之前安装过Tomcat,所以占 ...
- 消息列队 php 基于redis 实现
说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...
- 从实例看hibernate的主键生成策略
学习了hibernate会发现.hibernate中有实体类.实体类的映射文件.可是我们怎么样才干知道实体类的主键是如何的生成方式呢?hibernate提供的主键生成策略帮我们完美地解答了这个疑问.以 ...
- SQL获取事件探查器保存的跟踪文件
fn_trace_gettable (Transact-SQL) 以表格格式返回一或多个跟踪文件的内容. Transact-SQL 语法约定 语法 fn_trace_gettable ( filena ...
- Android逆向利器和smali代码修改出错举例-入参类型
当smali修改代码出错举例1,log如下: 虚拟机层次: 1.本身做出了预测,寄存器v2是符合要求入参,暗示你这个也许是你想要的.VFY: register1 v2 type 17, wanted ...
- 基于TCP应用协议/端口
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划
淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...
- Arcgis Engine(ae)接口详解(6):workspace操作
//此处用的workspace来源与用户选择 IWorkspace workspace = null; //workspace一般等同于数据库 //工作空间类型,也可理解为数据库类型 //esriFi ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的添加算饭scd 场景检测 代码实现
http://blog.csdn.net/mianhuantang848989/article/details/38035731 http://www.61ic.com/Article/DaVinci ...