51nod 1218 最长递增子序列 V2(dp + 思维)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218
题解:先要确定这些点是不是属于最长递增序列然后再确定这些数在最长递增序列中出现的次数,如果大于1次显然是可能出现只出现1次肯定是必然出现。那么就是怎么判断是不是属于最长递增序列,这个只要顺着求一下最长递增标一下该点属于长度几然后再逆着求一下最长递减标一下该点属于长度几如果两个下标之和等于最长长度+1那么该点就属于最长递增序列,然后就是求1~len(len表示最长的长度)中各个长度出现的次数就行。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 5e4 + 10;
int a[M] , b[M] , dpa[M] , dpb[M] , vis[M];
bool vs[M];
int binsearch(int l , int r , int num) {int mid = (l + r) >> 1;int ans = 0;while(l <= r) {mid = (l + r) >> 1;if(b[mid] > num) r = mid - 1;else {ans = mid;l = mid + 1;}}return ans;
}
int binsearch2(int l , int r , int num) {int mid = (l + r) >> 1;int ans = 0;while(l <= r) {mid = (l + r) >> 1;if(b[mid] < num) r = mid - 1;else {ans = mid;l = mid + 1;}}return ans;
}
int main() {int n;scanf("%d" , &n);for(int i = 1 ; i <= n ; i++) scanf("%d" , &a[i]);int len = 0;b[0] = -1;for(int i = 1 ; i <= n ; i++) {if(a[i] > b[len]) {len++;b[len] = a[i];dpa[i] = len;continue;}else {int pos = binsearch(1 , len , a[i]);b[pos + 1] = min(b[pos + 1] , a[i]);dpa[i] = pos + 1;}}int len2 = 0;memset(b , inf , sizeof(b));for(int i = n ; i >= 1 ; i--) {if(a[i] < b[len2]) {len2++;b[len2] = a[i];dpb[i] = len2;}else {int pos = binsearch2(1 , len2 , a[i]);b[pos + 1] = max(b[pos + 1] , a[i]);dpb[i] = pos + 1;}}memset(vs , false , sizeof(vs));for(int i = 1 ; i <= n ; i++) {if(dpa[i] + dpb[i] == len + 1) {vis[dpa[i]]++;vs[i] = true;}}printf("A:");for(int i = 1 ; i <= n ; i++) {if(vis[dpa[i]] > 1 && vs[i]) printf("%d " , i);}printf("\n");printf("B:");for(int i = 1 ; i <= n ; i++) {if(vis[dpa[i]] == 1 && vs[i]) printf("%d " , i);}printf("\n");return 0;
}
转载于:https://www.cnblogs.com/TnT2333333/p/7116959.html
51nod 1218 最长递增子序列 V2(dp + 思维)相关推荐
- [51Nod 1218] 最长递增子序列 V2 (LIS)
传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...
- LSI最长递增子序列(DP问题)
子问题:序列a,L[i]表示前i个字符的最大递增子序列的长度 对L[i+1],遍历前i个:a[0],,,a[i-1],max{L[i],L[j]+1} if a[j]<a[i]) 0<= ...
- 51nod 1376 最长递增子序列的数量(dp、CDQ分治 | BIT)
题意: N≤5×104的序列,0≤Ai≤109,求LIS的数量N\le5\times10^4的序列, 0\le A_i\le 10^9, 求LIS的数量 分析: f[i]:以第i个数结尾的LIS的长度 ...
- [网络流24题][codevs1906]最长递增子序列(dp+isap)
题目描述 传送门 题目的bug: 1.数据范围没给,不过目测随便开一下就好了 2.其实是最长不下降子序列 3.如果直接递减的话后两问输出n 题解 拆点 把一个点拆成两个点来保证每个点用的次数. 关系的 ...
- 51nod 1274 最长递增路径(DP)
一开始自己想了一种跑的巨慢..写了题解的做法又跑的巨快..一脸懵逼 显然要求边权递增就不可能经过重复的边了,那么设f[i]为第i条边出发能走多远就好了,这是我一开始的写法,可能dfs冗余状态较多,跑的 ...
- LeetCode 673. 最长递增子序列的个数(DP)
1. 题目 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, ...
- 51nod1134最长递增子序列(dp)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 这里说下,最长上升子序列和最长不降子序列几乎一样,只是判 ...
- 51Nod:1134 最长递增子序列
动态规划 修改 隐藏话题 1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.( ...
- 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)
[NOIP2004 提高组] 合唱队形 - 洛谷 思路:最少出列,即挑出最多,即找最长递增子序列和最长递减子序列 设dp1[i]为以h[i]结尾的最长递增子序列 dp2[i]为以h[i]开头的最长递减 ...
- 最长递增子序列的两种解法
以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...
最新文章
- 机器学习--局部加权线性回归
- UnicodeEncodeError: ‘latin-1‘ codec can‘t encode characters in position: ordinal not in range(256)
- 浅析java中的死锁_Java学习笔记五十五(死锁问题)
- 获取设置本地当前默认打印机
- opencv cv::mat::data是什么数据类型?
- python celery异步_【Python】Celery异步处理
- Oracle新建用户并授权
- matlab读取文件夹下所有文件的字符串,MATLAB读取文件夹下所有文件的文件名并读取数据...
- 持续集成工具集之四 Jenkins+Maven+Git+Tomcat 项目构建和自动部署
- android弹窗设计,想印:UI设计中弹窗设计的五条基本原则
- 为什么Ruby方法中使用感叹号?
- 添加css单词换行连字符
- 路由器总是有信号无网络连接到服务器,路由器信号满格但是没有网络怎么办
- html复制粘贴的文字自动换行,word中复制的文字出现自动换行怎么办
- 【Zotero更改pdf名字】Zotfile设置
- DMAIC代表了六西格玛改进活动的五个阶段
- 如何正确高效使用搜索引擎
- linux操作系统-----用户与组管理(3)
- 服务器Networking Latency测试
- svn 出现 Upgrade working working copy
热门文章
- 【RLchina第二讲】汪军老师推荐的强化学习理论学习资料
- 【5分钟 Paper】Deep Reinforcement Learning with Double Q-learning
- 通俗认识理解OpenAI Five
- 王云燕-永远好奇,一生求知
- bit, byte, KB, GB, TB, PB, EB, ZB, YB, BB, NB, DB, CB, XB
- 如何使用VUE做组件化开发 -- 思考篇
- 【转】十八个绝招把你从压力中营救出来
- 图像处理库Pillow
- 网络操作系统第七章习题
- Java 求一段代码运行所需要的时间——模板方法设计模式