洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp

题目:

https://www.luogu.com.cn/problem/B3637

最长上升子序列

题目描述

这是一个简单的动规板子题。

给出一个由 n(n\\le 5000) 个不超过 10\^6 的正整数组成的序列。请输出这个序列的**最长上升子序列**的长度。

最长上升子序列是指,从原序列中**按顺序**取出一些数字排在一起,这些数字是**逐渐增大**的。

输入格式

第一行,一个整数 n,表示序列长度。

第二行有 n 个整数,表示这个序列。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

```

6

1 2 4 1 3 4

```

样例输出 #1

```

4

```

提示

分别取出 1234 即可。

思路就是,求出第(1~n)为子序列结尾的最大长度,然后比较一下。用mem数组储存,我画了一个案例图,可以清楚地看出重复部分。

复制代码
#include<iostream>
#include<algorithm> 
using namespace std;
int n;
int nums[5005];
int mem[5005];
int dfs(int k)
{
	if(mem[k])
	return mem[k];
	int sum = 1;
	for(int i = 1 ; i < k ; i++)
	{
		if(nums[i] < nums[k])
		sum = max(sum,dfs(i)+1);
	}
	mem[k] = sum;
	return sum;
}
int main(void)
{
	int ans = -1e10;
	cin >> n;
	for(int i = 1 ; i <= n ; i++)
	cin >> nums[i];
	
	for(int i = 1 ; i <= n ; i++)
	{
		ans = max(ans,dfs(i));
	}
	cout << ans;
	return 0;
 } 

动态规划:'正序'dp

复制代码
#include<iostream>
#include<algorithm> 
using namespace std;
int n;
int nums[5005];
int f[5005];

int main(void)
{
	int ans;
	cin >> n;
	for(int i = 1 ; i <= n ; i++)
	cin >> nums[i];

	for(int i = 1 ; i <= n ; i++)
	{
		f[i] = 1;
		for(int j = 1 ; j < i ; j++)
		{
			if(nums[j] < nums[i])
			f[i] = max(f[i],f[j] + 1);
		}
	}
	sort(f+1,f+1+n);
	ans = f[n];
	cout << ans;
	return 0;
 } 
相关推荐
lkbhua莱克瓦244 分钟前
用C语言实现了——一个基于顺序表的插入排序演示系统
c语言·开发语言·数据结构·程序人生·github·排序算法·交互
软件派1 小时前
基于YOLO算法的目标检测系统实现指南
算法·yolo·目标检测
flying robot1 小时前
js在浏览器执行原理
开发语言·javascript·ecmascript
代码小将3 小时前
Leetcode209做题笔记
java·笔记·算法
dhxhsgrx4 小时前
PYTHON训练营DAY25
java·开发语言·python
Musennn4 小时前
leetcode 15.三数之和 思路分析
算法·leetcode·职场和发展
风逸hhh7 小时前
python打卡day25@浙大疏锦行
开发语言·python
刚入门的大一新生7 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
CM莫问7 小时前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
康谋自动驾驶8 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车