题目
在一个数字序列中,找对最长一个的子序列(可以不连续),使得这个子序列是不下降(非递减)的。
解题思路
与上一篇最大连续子序列和类似,我们将dp[i] 设计为 以下标 i 为结尾的子序列的最大长度; 但与上一篇不同的是,上一篇是连续的,故仅考虑邻接前后关系,而这题是可不连续的,故不难想到要用到两重循环。
- A[j] > A[i] 则, dp[i] = 1; (j < i)
- A[j] ≤ A[i], 且 d[j] + 1 > d[i], 则 d[i] = d[j] + 1; (j < i)
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 100;
int A[N], dp[N];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &A[i]);
}
int ans = -1;
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
dp[i] = 1;
for (int j = 1; j < i; j++)
{
if(A[i] >= A[j] && dp[j] + 1 > dp[i])
{
dp[i] = dp[j] + 1;
}
}
ans = max(ans, dp[i]);
}
printf("%d", ans);
return 0;
}```