diff --git a/TangDou/AcWing_TiGao/T1/LIS/896.md b/TangDou/AcWing_TiGao/T1/LIS/896.md index 8631593..394d645 100644 --- a/TangDou/AcWing_TiGao/T1/LIS/896.md +++ b/TangDou/AcWing_TiGao/T1/LIS/896.md @@ -40,10 +40,10 @@ $−10^9≤数列中的数≤10^9$ ### 二、贪心+二分优化 -#### 1、朴素版本 +#### 1、朴素算法 -> **朴素版本状态表示**: -> - 集合:$f[i]$表示从第一个数字开始算,以 $a[i]$ 结尾 的最长的上升序列长度。 +> **状态表示**: +> - 集合:$f[i]$表示以 $a[i]$ 结尾 的最长的上升序列长度 > - 属性:$max$ @@ -55,24 +55,26 @@ $N$的数据范围大了$100$倍,前一版本动态规划代码的时间复杂 #### 2、贪心+二分算法 ->核心思想: -对于同样长度的子串,希望它的末端越小越好,这样后面有更多机会拓展它,才有可能使得数列更长。 +>思想 : 对于同样长度的子串,希望它的末端越小越好,这样后面更易扩展它,使数列更长。 > **状态表示**: > - 集合:$f[i]$表示长度为$i$的递增子序列中,末尾元素最小的是$f[i]$ -> - 属性:$min$ +> - 属性:这个挺特殊,不是$max,min$,而是最终数列的长度$fl$ **算法步骤** -* 扫描每个原序列中的数字: - * 如果$f$中的最后一个数字$f[fl]$小于当前数字$a[i]$,那么就在$f$的最后面增加$a[i]$ - - * 如果$a[i]$小于$f[fl]$,在$f$中查找并替换第一个大于等于它元素 - -**举栗子模拟** + +> $f[fl]$:$f$中的最后一个数字,$fl$是数组中的游标。 + +扫描每个原序列中的数字$a[i]$: + ① 如果$a[i]$大于$f[fl]$,$f[++fl]=a[i]$,把$a[i]$ **接** 在$f[]$数组的最后面 + ② 如果$a[i]$小于$f[fl]$,在$f$中查找并替换第一个大于等于它元素 +> **解释**:这样操作就可以使得长度一样的上升子序列的每个位置是最小的数字! + +**举栗子**
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | --- | --- | --- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | --- | --- | --- | --- | --- |
@@ -81,8 +83,8 @@ $N$的数据范围大了$100$倍,前一版本动态规划代码的时间复杂
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | ---------------------------- | --- | --- | --- | --- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | ---------------------------- | --- | --- | --- | --- | --- | --- | | $f$ | $3$ | | --- | ------------------------------------------ | @@ -94,8 +96,8 @@ $1$ 比 $3$ 小, $3$出序列 ,$1$入序列
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | ------------------------------ | --- | --- | --- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | ------------------------------ | --- | --- | --- | --- | --- | | $f$ | $1$ | @@ -108,8 +110,8 @@ $2$ 比 $1$ 大,$2$入序列
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | ----------------------------- | --- | --- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | ----------------------------- | --- | --- | --- | --- | | $f$ | $1$ | $2$ | @@ -122,8 +124,8 @@ $1$ 比 $2$ 小,在$f$中找到第一个大于等于$1$的位置,并替换掉
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | --- | ---------------------------- | --- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | --- | ---------------------------- | --- | --- | --- | | $f$ | $1$ | $2$ | @@ -135,8 +137,8 @@ $8$ 比 $2$ 大
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | --- | --- | ---------------------------- | --- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | --- | --- | ---------------------------- | --- | --- | | $f$ | $1$ | $2$ | $8$ | @@ -148,8 +150,8 @@ $5$ 比 $8$ 小,在$f$中找到第一个大于等于$5$的数字,并替换掉
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | --- | --- | --- | ---------------------------- | --- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | --- | --- | --- | ---------------------------- | --- | | $f$ | $1$ | $2$ | $5$ | @@ -161,8 +163,8 @@ $6$ 比 $5$ 大
-| $arr$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | -| ----- | --- | --- | --- | --- | --- | --- | ------------------------------------------- | +| $a$ | $3$ | $1$ | $2$ | $1$ | $8$ | $5$ | $6$ | +| --- | --- | --- | --- | --- | --- | --- | ------------------------------------------- | | $f$ | $1$ | $2$ | $5$ | $6$ |