$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
典型的动态规划~
做腻了
首先读入数组$a$,存储这个序列(好像是废话)
然后定义一个数组int f[1010];
,表示第$a_i$是最长上升子序列里面的第$f_i$个数。
所以就得到了一个比较朴素的解法(双重循环):
#include <bits/stdc++.h>
using namespace std;
int n, a[1010], f[1010];
int main() {
scanf("%d", &n);
for (int i = 1;i <= n; i++) scanf("%d", &a[i]);
a[0] = -0x3f3f3f3f; //可能会有负数,所以a[0]要设置为无穷小
for (int i = 1;i <= n; i++)
for (int j = 0;j < i; j++)
if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1); //如果a数组符合“上升”的条件,就尝试更新f数组
int ans = 0;
for (int i = 1;i <= n; i++) ans = max(ans, f[i]); //取最大值ans
printf("%d\n", ans);
return 0;
}
这不是考csp的那一天吗?
很晚吗?
不算晚吧
这么晚了还在发题解
hhh