---
# System prepended metadata

title: '8/17 晚上解題1st, LIS'
tags: [DP]

---

---
tags: DP
title: 8/17 晚上解題1st, LIS
---


# Green Judge題目:
為了促進各位green judge解題速度，我會優先解答green judge的問題:grin: 
<font color="#f00"></font>

|    Green Judge Problem ID    |
|------------------------------|
|<font color="#0f0">b026</font>|
|<font color="#0f0">b027</font>|
|<font color="#0f0">b032</font>|


# Solutions:
:::success

## b026
### 題目：[Green Judge b026](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b026)
### 方法一：
- 窮舉所有序列，（一共n(n+1)/2個序列）並將每個序列的元素(n)一一加總
- Time Complexity: $O(n^3)$

### 方法二：
- 預處理 $sum_i=\Sigma_{j=1}^{i}a_j$
- 利用前綴合優化元素和的部份，要求第 $i$ 到 $j$ 項的和只要用 $sum_j-sum_{i-1}$ 就好了
- Time Complexity: $O(n^2)$

### 方法三（最佳解）：
- 令 $dp_i$ 是以第i個元素為最右一個元素時的最大和
    - 如果 $dp_{i-1} > 0$ ， $dp_i = dp_{i-1} + a_i$
    - 如果 $dp_{i-1} <= 0$ ， $dp_i = a_i$
- 記得答案是 $max(dp_1, dp_2, ..., dp_n)$
- Time Complexity: $O(n)$
:::

:::success
## b027
### 題目：[Green Judge b027](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b027)
### 方法一：
- 窮舉邊長，從1到 $min(H, W)$ ，設邊長$k$
- 一共$(H-k+1)(W-k+1)$個邊長為k的正方形，
- 檢查每個正方形：$O(k^2)$
- Time Complexity: $O(HW * min(H, W)^3)$

### 方法二：
- 矩陣前綴和：
    - 令$sum_{i,j} = \sum_{p=1}^{i}\sum_{q=1}^{j}a_{pq}$
- 求特定矩形和：
    - $\sum_{p=a}^{b}\sum_{q=c}^{d}a_{pq}$
    $= sum_{b,d} - sum_{a-1,d} - sum_{b,c-1} + sum_{a-1,c-1}$
    - （媽呀就是排容原理）
- Time Complexity: $O(HW * min(H, W))$

### 方法三：
- 又來 DP 了～
- 令 $dp_{ij}$ 是以第 i, j 格為右下角的正方形最大邊長（這招常用喔～）
- 然後寫出遞迴式：
    - 如果 $a_{ij} = 1$ （樹），$dp_{ij} = 0$
    - 如果 $a_{ij} = 0$，$dp_{ij} = min(dp_{i-1,j}, dp_{i-1,j-1}, dp_{i-1,j-1})$
- Time Complexity: $O(HW)$
:::
:::success

## LIS (Longest Incresing Subsequence)

### 題目：[Green Judge b032](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b032)

### 方法一：
- 令 $dp_i$ 是以第 $i$ 項為結尾的 lis
- 對於所有 $j$ 滿足 $a_i > a_j$
    - $dp_i = max\{dp_j\} + 1$
- Time Complexity: $O(n^2)$

### 方法二：
*適用條件：當lis長度一樣時，最後一個元素越小越好。*
*[必須用方法一 的 UVa 103](http://domen111.github.io/UVa-Easy-Viewer/?103)*
- 假設 $dp2_i$ 為lis的長度為 $i$ 時最後一個元素的最小值
- 可以發現 $dp2$ 為一個遞增序列！！
- 因為遞增，所以可以從左道右對於第 $i$ 個數字，在dp2這個序列裡二分搜第 $i$ 項的位置，便能找到以第 $i$ 項為結尾的 lis 長度
- 記得用第 $i$ 項更新 $dp2$ 喔～
- Time Complexity: $O(nlogn)$


### 求LIS的方法很多，講不完～

- 練習題：
給一些座標點，請找出最長序列S滿足（對於每個i）
s[i].x < s[i+1].x && s[i].y < s[i+1].y
:::
:::info
## 作業：
*題目不難，至少選兩題寫喔～*
[PA UVa 437](http://domen111.github.io/UVa-Easy-Viewer/?437)
[PB UVa 481](http://domen111.github.io/UVa-Easy-Viewer/?481)
[PC UVa 10534](http://domen111.github.io/UVa-Easy-Viewer/?10534)
[PD TIOJ 1907](https://tioj.ck.tp.edu.tw/problems/1907)
[PE UVa 103](http://domen111.github.io/UVa-Easy-Viewer/?103)
:::