# Weekly Contest 403 日期 2024/06/23 目前可以穩定第一跟第二題,第三題大致上就是 Blind 75 基本題。不過我總是想不出來啊哈哈, Dynamic Programming 好難喔。 - [Minimum Average of Smallest and Largest Elements](https://leetcode.com/problems/minimum-average-of-smallest-and-largest-elements/) - [Find the Minimum Area to Cover All Ones I](https://leetcode.com/problems/find-the-minimum-area-to-cover-all-ones-i/) - [Maximize Total Cost of Alternating Subarrays](https://leetcode.com/problems/maximize-total-cost-of-alternating-subarrays/) - [Find the Minimum Area to Cover All Ones II](https://leetcode.com/problems/find-the-minimum-area-to-cover-all-ones-ii/) ### 第一題 ```clike double minimumAverage(vector<int>& nums) { const int n = nums.size(); sort(nums.begin(), nums.end()); double s = 50; for(int i = 0; i < n / 2; i++) { double x = nums[i] + nums[n - i - 1]; x = x / 2; s = min(x, s); } return s; } ``` ### 第二題 ```clike int minimumArea(vector<vector<int>>& grid) { const int m = grid.size(); const int n = grid[0].size(); vector<int> rows(m, 0); vector<int> cols(n, 0); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { rows[i] |= grid[i][j]; cols[j] |= grid[i][j]; } } int l1 = 0; for(int i = 0; i < m; i++) { if(rows[i]) { l1 = i; break; } } int l2 = 0; for(int i = 0; i < m; i++) { if(rows[m - i- 1]) { l2 = m - i - 1; break; } } int c1 = 0; for(int j = 0; j < n; j++) { if(cols[j]) { c1 = j; break; } } int c2 = 0; for(int j = 0; j < n; j++) { if(cols[n - j - 1]) { c2 = n - j - 1; break; } } return (l2 - l1 + 1) * (c2 - c1 + 1); } ``` ### 第三題 Dynamic Programming 問題。果然我自己缺乏動態轉移規劃的能力,題目類似於 House Robber 問題,參考討論區: - [討論區 1](https://leetcode.com/problems/maximize-total-cost-of-alternating-subarrays/solutions/5355246/masked-house-robber) - [討論區 2](https://leetcode.com/problems/maximize-total-cost-of-alternating-subarrays/solutions/5355147/take-not-take-dp) - `notTake` 之後可以接 `Take` 與 `notTake` - `Take` 之後只能接 `notTake` ```clike using ll = long long; vector<vector<ll>> dp; long long maximumTotalCost(vector<int>& nums) { dp = vector<vector<ll>>(nums.size(), vector<ll>(2, -1)); return nums[0] + solve(nums, 1, 1); } ll solve(vector<int> &nums, int start, int f) { const int n = nums.size(); if(start >= n) return 0; if(dp[start][f] != -1) return dp[start][f]; ll take = -1e15; ll notTake = -1e15; if(f == 1) notTake = (-nums[start]) + solve(nums, start + 1, 0); take = nums[start] + solve(nums, start + 1, 1); dp[start][f] = max(take, notTake); return dp[start][f]; } ``` ### 第四題