题面

传送门

分析

设dp[i]是第i个积木在自己的位置上时,前i个积木中最多能回到自己位置的数目。

\(dp[i]=max(dp[j])+1 (i>j,a[i]>a[j],a[i]-a[j]<=i-j)\)

其中\(a[i]>a[j]\)是保证i,j都在自己的位置上,\(a[i]-a[j]<=i-j\)是为了保证中间有足够的积木让i能在a[i]这个位置上。

转换一下发现有三个条件:

$(1) i>j \(
\) (2) i-a[i]>=j-a[j]\(
\)(3) a[i]>a[j]$

发现 (2)+(3)就可以得到(1)

所以只剩两个条件

那么就只要按照i-a[i]排序求LIS即可。

由于i-a[i]相等时,a[i]升序就可以使答案最大,所以排序的时候第二关键字要弄成a[i]。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int n;
int a[maxn];
struct node{
int key;
int val;
friend bool operator < (node p,node q){
if(p.key==q.key) return p.val<q.val;
else return p.key<q.key;
}
}b[maxn];
int s[maxn];
int top=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i].key=i-a[i];
b[i].val=a[i];
}
sort(b+1,b+1+n);
for(int i=1;i<=n;i++){
if(b[i].key<0) continue;//如果i-a[i]<0,即a[i]>i,则i肯定不能在合适的位置上,直接跳过
if(b[i].val>s[top]){
s[++top]=b[i].val;
}else{
int pos=lower_bound(s+1,s+1+top,b[i].val)-s;
s[pos]=b[i].val;
}
}
printf("%d\n",top);
}

BZOJ 1109 (LIS)的更多相关文章

  1. ZOJ 1093 Monkey and Banana (LIS)解题报告

    ZOJ  1093   Monkey and Banana  (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. 浅谈最长上升子序列(LIS)

    一.瞎扯的内容 给一个长度为n的序列,求它的最长上升子序列(LIS) 简单的dp n=read(); ;i<=n;i++) a[i]=read(); ;i<=n;i++) ;j<i; ...

  3. 最长递增子序列(LIS)(转)

    最长递增子序列(LIS)   本博文转自作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   --- 最长递增子序列又叫做最长上升子序列 ...

  4. Poj 2533 Longest Ordered Subsequence(LIS)

    一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  5. Poj 3903 Stock Exchange(LIS)

    一.Description The world financial crisis is quite a subject. Some people are more relaxed while othe ...

  6. DP——最长上升子序列(LIS)

    DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...

  7. 最长上升子序列(LIS)nlogn模板

    参考https://www.cnblogs.com/yuelian/p/8745807.html 注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound 比如123458 ...

  8. 低价购买 (动态规划,变种最长下降子序列(LIS))

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 最长上升子序列(LIS)问题

    最长上升子序列(LIS)问题 此处我们只讨论严格单调递增的子序列求法. 前面O(n2)的算法我们省略掉,直接进入O(nlgn)算法. 方法一:dp + 树状数组 定义dp[i]:末尾数字是i时最长上升 ...

随机推荐

  1. CSS中如何设置父元素透明度不影响子元素透明度

    原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...

  2. 使用Nginx代理和转发Websocket连接

    1.Websocket 简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 2.Nginx 简介 ...

  3. 2018-8-10-使用-Resharper-特性

    title author date CreateTime categories 使用 Resharper 特性 lindexi 2018-08-10 19:16:51 +0800 2018-4-25 ...

  4. Spring Boot 全局排除 spring-boot-starter-logging 依赖

    https://blog.csdn.net/u013314786/article/details/90412733 项目里使用了log4j2做日志处理,要排除掉Spring Boot 很多jar里边默 ...

  5. webpack webpack.config.js配置

    安装指定版本的webpack npm install webpack@3.6 -g 安装live-server    运行项目插件   输入live-server  运行后自动打开网页 npm ins ...

  6. keepalived的配置文件

    ! Configuration File for keepalived global_defs { notification_email { # acassen@firewall.loc # fail ...

  7. 树——binary-tree-postorder-traversal(树的前序遍历)

    问题: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...

  8. oracle汇编03

    .long expression1, expression2, ..., expressionNThe .long directive generates a long integer (32-bit ...

  9. [CF] E. Camels

    CF 2000 的dp题目还是有点难qwq 题意: 一行有\(n\)个空位,每个空位可以填\([1,4]\)的整数,要求: 1.有\(t\)个位置满足 \(ai−1<ai>ai+1(1&l ...

  10. 【串线篇】spring boot自动配置原理

    配置文件到底能写什么?怎么写?自动配置原理: 配置文件能配置的属性参照 一.自动配置原理: 1.1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfigur ...