[AcWing] 895. 最长上升子序列(C++实现)线性dp例题
1. 题目
2. 读题(需要重点注意的东西)
思路:
闫式dp分析法
用闫式dp分析法分析最长上升子序列问题
即判断第 j 个数和第 i 个数的大小关系,如果a[j] < a[i]
,则f[i] = f[j] +1
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include<iostream>
using namespace std;
const int N = 1010;
int n;
int a[N];
int f[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 <= i;j++){
if(a[j] < a[i]) f[i] = max(f[i],f[j]+1);
}
}
int res = -1e9;
for(int i = 1;i<= n;i++){
res = max(res,f[i]);
}
cout << res << endl;
return 0;
}
可能存在的问题
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 动态规划
- 线性dp
6. 总结
线性dp的例题,理解思想并自行推导出代码。