动态规划 #线性dp,最长上升子序列


来自于acwing

思路

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
两个for循环,一个记录以i下标为末尾时的上升子序列长度是多少,另一个用来遍历0~i-1范围内的数来计算上升子序列有多长
最后max运算每个数作为子序列末尾时的序列长度即可

状态表示

f[i]=>以a[i]元素为末尾的序列最长上升子序列的长度
1 2 3 4 f[3]=3

状态计算

在这里插入图片描述

可以发现,如果当前数字比上一个数字大 即 a[i]>a[j] 的时候
f[i]=f[j]+1,a[i] > a[j] 也一定大于 a[j] 大于的所有数字,再算上a[j]就是+1

完整代码

#include<iostream>

using namespace std;

const int N =1010;
//f[n] : 以n下标所对应的元素为末尾的最长上升子序列的长度
int a[N],q[N],f[N];
int n,res;

int main(){
	cin >> n;
	
	for(int i=1; i<=n; i++)cin>>a[i];
	
	for(int i=1; i<=n; i++){
	    //最长上升子序列的最小长度为1
		f[i]=1;
		for(int j=1; j<=i; j++){
			if(a[i]>a[j])f[i]=max(f[i],f[j]+1);
		}
		//以谁为末尾元素有最长的长度我们不得知,需要遍历求出
		res=max(res,f[i]);
	}
	
	cout<<res;
	
	return 0;
}

结语


🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻

🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹

😇 本篇文章存在多处不足,如有修改意见,可以私信或者评论哦,还望海涵 😇


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值