AcWing 1490. 最长上升子串 模拟优化
地址 https://www.acwing.com/solution/content/15094/
给出一个长度为 n 的由正整数构成的序列,你需要从中删除一个正整数,很显然你有很多种删除方式,你需要对删除这个正整数以后的序列求其最长上升子串,请问在所有删除方案中,最长的上升子串长度是多少。 这里给出最长上升子串的定义:即对于序列中连续的若干个正整数,满足 ai+1>ai,则称这连续的若干个整数构成的子串为上升子串,在所有的上升子串中,长度最长的称为最长上升子串。 输入格式 输入第一行仅包含一个正整数 n,表示给出的序列的长度。 接下来一行有 n 个正整数,即这个序列,中间用空格隔开。 输出格式 输出仅包含一个正整数,即删除一个数字之后的最长上升子串长度。 数据范围 1≤n≤105, 1≤ai≤105 输入样例: 5 2 1 3 2 5 输出样例: 3
算法1
首先考虑使用暴力遍历解答,逐个删除某个数字然后双指针统计上升子串的长度。
过程中我们会发现,如果删除该元素 对于上升子串没有提升的长度 则可以考虑剪枝。
对于上升子串没有提升的长度的定义呢 就是该数字的左边的数小于该数字右边的数。
那么进一步的优化,如果我们首先统计以该数字为结尾和以该数字为开始 的上升子串的长度,
可以减少不少的计算量。
类似如此
a b c d 如果我们实现统计了 以各个元素为结尾的最长上升子串长度 ai bi ci di
统计了 以各个元素为起始的最长上升子串长度 aj bj cj dj.
那么如果 a < c 我们可以尝试删除b,得到子串长度就是 ai+bj;
但如果b < d 我们可以尝试删除c,得到的子串长度就是bi+dj;
代码实现见Y总得示例代码
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010; int n; int a[N], f[N], g[N]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]); // 预处理f[i]:以i结尾的单调上升子串的最大长度 for (int i = 1; i <= n; i ++ ) if (a[i] > a[i - 1]) f[i] = f[i - 1] + 1; else f[i] = 1; // 预处理g[i]:以i开头的单调上升子串的最大长度 for (int i = n; i; i -- ) if (a[i] < a[i + 1]) g[i] = g[i + 1] + 1; else g[i] = 1; int res = 0; // 枚举删除哪个数 for (int i = 1; i <= n; i ++ ) if (a[i - 1] >= a[i + 1]) res = max(res, max(f[i - 1], g[i + 1])); else res = max(res, f[i - 1] + g[i + 1]); printf("%d\n", res); return 0; }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话