题目描述:在一个数列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(即非递减的)
举例:A={1,2,3,-1,-2,7,9} (下标从1开始),它的最长不下降子序列为{1, 2,3, 7,9}
- 分析:将dp[i]表示为以A[i]结尾的最长的非递减子序列
- dp[i]默认值为1,即只有它一个元素
- 对i之前的元素进行遍历,判断是否A[j]<=A[i]以及dp[i] > dp[j]+1
- 如果是,则状态转移方程为 dp[i] = dp[j] + 1;
上代码
```c++
//最长不下降子序列
#include <bits/stdc++.h>
using namespace std;
int f[1001], dp[1001];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
scanf("%d", &f[i]);
}
dp[0] = 0;
int max_n = 0;
for (int i = 1; i <= n; ++i) {
dp[i] = 1;
//遍历i前面的元素,如果有f[j]<=f[i]并且在原有的dp[j]上+f[i]本身 -> 大于dp[i],则表示能接上,形成长度加一的子序列
for (int j = 1; j < i; ++j) {
if((f[j] <= f[i]) && (dp[i] < dp[j] + 1)) {
dp[i] = dp[j] +1;
}
}
max_n = max(max_n, dp[i]);
}
cout << max_n;
return 0;
}