--- 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) :::