相关题目:
最长上升子序列https://www.acwing.com/problem/content/897/
解题思路:
我在b站上找到了一个比较好的讲解视频。
【算法太难了】【23】最长递增子序列-动态规划
相关代码:
#include <iostream>
#include<cmath>
using namespace std;
int n;
/*
a[i]储存了序列中所有的数。
f[i]表示的是以a[i]结尾,前i个数中,最长上升子序列。
*/
/*
注意:f[i]数组不一定是单调递增的,很有可能是无序的。
*/
/*
i是为了确定以a[i]结尾的序列,
j是为了确定以a[i]结尾的最长上升子序列,即为f[i].
*/
int a[1001], f[1001];
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
int mx =1; //计算出所有f[i]中的最大值,即为mx
for(int i=0;i<n;i++){
f[i]=1; //f[i]的最小值为1.
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (a[i] > a[j]){
f[i]=max(f[i],f[j]+1);
/*
之前的最大f[i]和目前j移动到某位置所指的数为f[j]+1,
两者进行比较看下谁大。
*/
}
}
//找出最大的mx,即为最长上升子序列。
if(mx<f[i]){
mx=f[i];
}
}
cout << mx << endl;
return 0;
}