上一节我们提到过最长递增子序列,这篇我们就来学习一下最长递增子序列。
问题描述:
给定一个长度为n的数组,找出一个最长的单调递增子序列
思路:
定义状态dp[i]表示以第 i 个数为结尾的最长递增子序列的长度,那么有dp[i]=max(dp[j]+1);
最终答案就是max { dp [ i ] };
复杂度分析:
j在0~ i 滑动,复杂度为O(n);i的变化范围也为O(n);总复杂度为O(n^2) ,需要注意的是DP不是LIS的最优解法,较好的解法我们在上一篇博客中介绍了。
代码实现
#include <bits/stdc++.h>
using namespace std;
int dp[10005], a[10005];
int n;
int MAX(int dp[]) {
int t = dp[1];
for (int i = 2; i <= n; i++)
if (dp[i] > t)
t = dp[i];
return t;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
dp[i] = 1;
for (int j = 1; j < i; j++)
if (a[j] < a[i])
dp[i] = max(dp[i], dp[j] + 1);
}
cout << MAX(dp);
return 0;
}
下一篇我们来介绍动态规划能够解决的其他问题。