--- title: "最长上升子序列" created: 2025-11-28 tags: - 算法 --- # 最长上升子序列 ## 题目 [最长上升子序列](https://www.acwing.com/problem/content/897/) ![[image-73c224e9.png]] ## 思路分析 3 1 2 1 8 5 6中找到的最长上升子序列是 1 2 5 6 长度为4 可以用f[i]表示以a[i]结尾的上升子序列最大长度 有点类似于kmp算法 对于f[i]只需要找到它前面的比它小的一个数的f[j] 然后在它的基础上加1即可推到当前的f[i] 比如:f[7]表示以a[7]也就是6结尾的最长上升子序列的长度 那么它的状态就是从前面的 12 125……转移过来 长度就是2+1或3+1中更大的那一个 `for(int j=1;j using namespace std; const int N=1010; int a[N],f[N]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ f[i]=1; for(int j=1;j using namespace std; const int N=1010; int a[N],f[N]; int g[N];//记录路径 int n; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ f[i]=1; g[i]=0; for(int j=1;jf[i]){ f[i]=f[j]+1; g[i]=j; } } } } int k=1;//记录最优解的下标 for(int i=1;i<=n;i++) if(f[k]