动态规划
线性 DP-最长上升子序列
最长上升子序列
1、最长上升子序列(easy):给定一个长度为 $n$ 的数组 $a$ ($n \leq 1000$),求其最长上升子序列(非降)的长度。注意:子序列不一定是连续的
2、对于线性 DP,通常用 $dp[i]$ 表示以 $i$ 结尾或到 $i$ 为止,如果有对应的代价,通常用 $dp[i][j]$ 表示到 $i$ 为止花费 $j$ 的代价的价值最值(见背包问题)
3、确定状态:令 $dp[i]$ 表示以 $i$ 结尾的最长上升子序列长度
4、确定转移:对于输入的每一个 $a[i]$ ,可知都有两种情况:一种是它作为最长上升子序列的起点,另一种是它接续在其他上升子序列之后。对于 $a[i]$ 作为起点,$dp[i] = 1$ ;对于 $a[i]$ 作为接续,应向左搜寻一个 $j \lt i$,$dp[i] = max(dp[i], dp[j] + 1)$ ,遍历取最大值。总结状态转移方程为:
$$ \left\{ \begin{array}{l} dp[i] = 1 &作为起点 \\\\ dp[i] = max(dp[i], dp[j] + 1) &作为接续 \\\end{array} \right. $$
5、易知,该算法复杂度为 $O(n^2)$,只能处理小规模数据,仍需优化