惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
博客园 - 【当耐特】
D
Docker
Y
Y Combinator Blog
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
B
Blog
The GitHub Blog
The GitHub Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
爱范儿
爱范儿
A
About on SuperTechFans
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
LIS续:动态规划
小汪同学^_^ · 2026-05-20 · via 博客园_首页

如果对dp不熟,可以先看这篇文章

接上文——
发完上一篇随笔后,我灵光一闪,想到了用DP做的思路。
于是就写下了这篇随笔(好像是废话)。

1.思路1

考虑用 \(dp[i]\) 来存储 \(1\) ~ \(i\) 的最优解,可是后面你会发现……

根 本 解 不 出 来 !

只是因为再求 \(dp[i + 1]\) 的时候,不知道 \(dp[i]\) 的末尾是什么。那怎么解决这个问题呢?

2.思路2

简单,用 \(dp[i]\) 来存储末尾下标是 \(i\) 的最优解就行了!
于是可以得到当不选时,最优解就是 \(dp[i]\)
而选的时候,就要一直向前遍历,直到找到一个既能匹配 \(a[i]\) 又是最优解的 \(dp[j]\)
可以写出如下代码:

for(int i = 1; i <= n; i++){
	for(int j = 1; j < i; j++){
		if(a[i] > a[j])
			dp[i] = max(dp[i], dp[j] + 1);
	}
}

思路出来了,代码也就显而易见了。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, a[200010] = { 0 }, dp[200010] = { 0 }, maxn = -1;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= n; i++){
		for(int j = 1; j < i; j++){
			if(a[j] < a[i])
				dp[i] = max(dp[i], dp[j] + 1);
		}
	}
    for(int i = 1; i <= n; i++) maxn = max(maxn, dp[i]);
	cout << "max=" << maxn + 1; //这里不加一的话答案就一定会少一
}