登山 最长上升子序列问题 线性DP

news/2024/10/20 11:25:34/

🍑 算法题解专栏


🍑 洛谷 登山

登山

题目描述

五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入格式

Line1:N(2<=N<=1000)景点数

Line2:N个整数,每个景点的海拔

输出格式

最多能浏览的景点数

样例 #1

样例输入 #1

8
186 186 150 200 160 130 197 220

样例输出 #1

4

🍑 题意(阅读理解)
① 按照编号递增的顺序来浏览 --> 子序列
② 相邻两个经典海拔不能相同 --> 严格递增/减
③ 一旦开始下降,就不能上升的 --> 先爬山 后下山

🤠 思路
① 取中点 k,求两边最大的递增递减的最长子序列长度 O(n^3)
② 预处理左右两边的最长上升子序列长度,O(n^2)

🍑 res = max( f[i] + g[i] -1) , 0 <= i < n
🍤 中间点算了两次,-1

👨‍🏫 注意数组下标对应的关系

import java.util.Scanner;public class Main
{static int N = 1010;static int[] w = new int[N];static int[] f = new int[N];static int[] g = new int[N];public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 1; i <= n; i++)w[i] = sc.nextInt();for (int i = 1; i <= n; i++){f[i] = 1;for (int j = 1; j < i; j++)if (w[i] > w[j])f[i] = Math.max(f[i], f[j] + 1);}for (int i = n; i > 0; i--){g[i] = 1;for (int j = n; j > i; j--)if (w[i] > w[j])g[i] = Math.max(g[i], g[j] + 1);}int res = 0;for (int i = 1; i <= n; i++)res = Math.max(res, f[i] + g[i] - 1);System.out.println(res);}
}

http://www.ppmy.cn/news/61381.html

相关文章

用户界面对象的线程亲缘性第二篇: 设备上下文

在上一篇文章中&#xff0c;我们简单地介绍了控制窗口句柄的线程亲缘性规则。 今天&#xff0c;我们来讲讲设备上下文(Device Context, 简称 DC) 。 设备上下文也有一定程度的线程亲缘性。调用 DC 相关函数&#xff0c;例如 GetDC 的线程&#xff0c;必须在同一个线程中调用其…

PID整定二:基于Ziegler-Nichols的频域响应

PID整定二&#xff1a;基于Ziegler-Nichols的频域响应 1参考2连续Ziegler-Nichols方法的PID整定2.1整定方法2.2仿真示例 1参考 1.1根轨迹图的绘制及分析 1.2计算机控制技术01-3.4离散系统的根轨迹分析法 1.3PID控制算法学习笔记 2连续Ziegler-Nichols方法的PID整定 2.1整定…

leetcode:234.回文链表(详解)

前言&#xff1a;内容包括-题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&…

Java日志详解

文章目录 1.日志的概述1.1 日志文件1.1.1 调试日志1.1.2 系统日志 1.2 JAVA日志框架1.2.1 为什么要用日志框架1.2.2 日志框架和日志门面 2.JUL2.1 JUL简介2.2 JUL组件介绍2.3 JUL的基本使用2.3.1 日志输出的级别2.3.2 日志的输出方式2.3.3 自定义日志的级别2.3.4 将日志输出到具…

【产品方案】后台管理系统设计思路

第一章 前言 相比前端设计&#xff0c;我更喜欢设计后台管理系统。如果说前端设计考验的是共情能力&#xff0c;那后台管理系统设计考研的就是逻辑能力&#xff0c;前者需要站在用户的角度&#xff0c;后者是站在管理者的角度思考。 有幸参与了公司不少业务系统从“0-1”的设计…

Lerna

Lerna Lerna是一个优化基于gitnpm的多pagkage项目的管理工具 解决的痛点 痛点一:重复操作 多Package本地link多Package依赖安装多Package单元测试多Package代码提交多Package代码发布 痛点二:版本一致性 发布时版本一 致性发布后相互依赖版本升级 package越多&#xff0c;管…

6.1.1 图:基本概念

一&#xff0c;基本概念 1.基本定义 &#xff08;1&#xff09;图的定义 顶点集不可以是空集&#xff0c;但边集可以是空集。 &#xff08;2&#xff09; 有向图的表示&#xff1a; 圆括号 无向图的表示&#xff1a; 尖括号 简单图、多重图&#xff1a; 简单图&#xff1a;…

强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3)

基于策略的离线算法TD3 1.1 简介 reference: openai-TD3 DDPG的critic会高估, 从而导致actor策略失败。TD3是增加了三个关键技巧优化DDPG。经过优化后的TD3(Twin Dalayed DDPG 双延迟深度确定性策略梯度算法)适合于具有高维连续动作空间的任务。 Tricks: Clipped Double Q-l…