最长上升子序列
来源:互联网 发布:搜房帮网络经纪人登录 编辑:程序博客网 时间:2024/06/08 14:01
问题描述 Problem Description
LIS 问题是最经典的动态规划基础问题之一。 如果要求一个满足一定条件的最长上升子
序列,你还能解决吗?
给出一个长度为
例如:对于长度为
限制一定要包含第
输入描述 Input Description
第一行为两个整数
接下来是
输出描述 Output Description
请输出两个整数, 即包含第
输入样例 Sample Input
8 6
65 158 170 299 300 155 207 389
输出样例 Sample Output
4
数据范围及提示 Data Size & Hint
对于所有的数据,满足
分析 I Think
求包含
代码 Code
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int f[200001];int a[200001];int b[200001];int n,m;int lis(int,int);int binary(int,int,int);int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<m;++i) if(a[i] <= a[m]) b[++b[0]] = a[i]; b[++b[0]] = a[m]; for(int i=1+m;i<=n;++i) if(a[i] >= a[m]) b[++b[0]] = a[i]; printf("%d\n",lis(1,b[0])); return 0;}int lis(int L,int R){ f[f[0]=1] = b[L]; for(int i=L+1;i<=R;++i){ if(b[i] > f[f[0]]) f[++f[0]] = b[i]; else if(f[1] > b[i]) f[1] = b[i]; else f[binary(1,f[0],b[i])] = b[i]; } return f[0];}int binary(int L,int R,int N){ int M; while(L+1 < R){ M = (L+R)>>1; if(f[M] == N) return M; if(f[M] > N) R = M; else L = M; } if(f[L] > N) return L; return R;}
0 0
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 随笔“敢“想
- centos ngnix+php+mysql开机启动
- 安装Nginx服务器所需要的系统资源
- BAT 面试指南
- 什么时候写new ,什么时候不写new
- 最长上升子序列
- 支付宝集成过程详解Demo
- #!/bin/sh与#!/bin/bash的区别
- view移除父类
- c++初识以及函数重载
- EventBus使用详解(一)——初步使用EventBus
- Linux raw socket
- Android应用开发学习—Toast使用方法
- pushdom