
思路
给定一个长度为 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;
}
结语
🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻
🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹
😇 本篇文章存在多处不足,如有修改意见,可以私信或者评论哦,还望海涵 😇

905

被折叠的 条评论
为什么被折叠?



