怎麼每日一題又是動歸

2021-02-08 不知道說啥的只希望所有都AC


410. 分割數組的最大值

410. 分割數組的最大值preface題目與解法總結


preface

雖然說微信的公眾號有些Σ(☉▽☉"a,我純複製markdown的內容居然不太行,實在做的太爛了(不是。

今天的內容,或者說每日一題也是實在變態,一看到就直接翻翻答案找找思路這樣o(╥﹏╥)o,話不多說進入正題。今天的內容依然是動歸主題。

題目與解法
給定一個非負整數數組和一個整數 m,你需要將這個數組分成 m 個非空的連續子數組。設計一個算法使得這 m 個子數組各自和的最大值最小。
注意:數組長度 n 滿足以下條件:
1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:
輸入:nums = [7,2,5,10,8]m = 2
輸出:18
解釋:一共有四種方法將nums分割為2個子數組。其中最好的方式是將其分為[7,2,5] 和 [10,8],因為此時這兩個子數組各自的和的最大值為18,在所有情況中最小。
來源:力扣(LeetCode)連結:
https://leetcode-cn.com/problems/split-array-largest-sum

著作權歸領扣網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


一看到這,直接推,翻閱答案,沒想到你這濃眉大眼的也是用動歸?

仔細閱讀題目,那麼可以知道我們有n個數字,m個組,並且,假設有變量k表示前k個數字被分為m - 1組與剩下的數值之和之間最大值就是就是當前分組狀態下所取的值。所以我們只要遍歷從k 到 n求最小值即可算出所求n個數字, m個分組的最優值。又因為n,m都與前面的數值有關,所以需要遍歷兩次n, 一次m。

話不多說,先看代碼

#include <iostream>#include <vector>#include <algorithm>using namespace std;
class Solution {public: int splitArray(vector<int>& nums, int m) { const auto n = static_cast<int>(nums.size()); vector<vector<long long>> dp(n + 1, vector<long long>(m + 1, LLONG_MAX)); vector<long long> sub(n + 1, 0); for (auto i = 0; i < n; ++i) { sub[i + 1] = sub[i] + nums[i]; } dp[0][0] = 0; for (auto i = 1; i <= n; ++i) { for (auto j = 1; j <= min(i, m); ++j) { for (auto k = 0; k < i; ++k) { dp[i][j] = min(dp[i][j], max(dp[k][j - 1], sub[i] - sub[k])); } } } return static_cast<int>(dp[n][m]); }};
int main(){ vector<int> vec{ 7, 2, 5, 10, 8 }; Solution s; cout << s.splitArray(vec, 2); return 0;}

當然了,我前一篇文章說過,動歸通常不是最優解,因為他會無限接近暴力法的方式。

我們再仔細看看題目,似乎我們可以設定一個上下限,然後不斷迫近最優值。也就是說,最低值只可能是分出一個,然後這個值是nums裡面的最大值,最大值也只有m為一時,所有數組加起來的值,那麼我們只有不斷折半查找其中的值即可。那麼,驗證這種對半的說產生的值的方法是我們在這nums總能找到不大於m的分組,這樣一來,我們就可以知道至少這個值可以是新的上界,如若不然,則一定是新的下界。為了打破這種循環,我們算出的下界加一即可。

#include <iostream>#include <vector>using namespace std;
class Solution {public: int splitArray(vector<int>& nums, int m) { auto check = [&nums](const int x,const int m) { long long sum = 0; auto cnt = 1; for (auto i = static_cast<size_t>(0); i < nums.size(); ++i) { if (sum + nums[i] > x) { ++cnt; sum = nums[i]; } else { sum += nums[i]; } } return cnt <= m; }; long long lhv = 0, rhv = 0; for (auto i = static_cast<size_t>(0); i < nums.size(); ++i) { rhv += nums[i]; if (lhv < nums[i]) { lhv = nums[i]; } } while (lhv < rhv) { const auto mid = lhv + ((rhv - lhv) >> 1); if (check(mid, m)) { rhv = mid; } else { lhv = mid + 1; } } return static_cast<int>(lhv); }};
int main(){ vector<int> vec{ 7, 2, 5, 10, 8 }; Solution s; cout << s.splitArray(vec, 2);
return 0;}


總結

還是看題解大法好~


相關焦點

  • 高三每日一題(133)
    ,判斷極值正負高三每日一題(60):形直譯數解釋,動圓問題高三每日一題(59):利用數量積,化為實數高三每日一題(58):齊次化,求三元最值>高三每日一題(49)任意存在,換元分類高三每日一題(48)輔助構圖,解決向量高三每日一題(47)動中有靜,圓中求角高三每日一題(46)恰當換元,數列通項
  • 必勝課英語每日一題0222
    G7必勝課英語每日一題0222– How do you pay      your lunch every day?
  • 2017年11月22日每日一題
    答案: 18種;六年級1/2×(1+1/3+1/6+1/10+1/15+1/20)答案: 103/12011月21日語文每日一題答案低年級語文每日一題寫出兩句有關思鄉的詩句參考答案:C.你怎麼可以取笑禿鶴的腦袋呢?D.你沒學過《草房子》這部小說嗎?答案:D高年級語文每日一題按要求改寫句子。明年我就是一名初中生了。疑問句:反問句:設問句:答案:明年我就是一名初中生了嗎?
  • 【每日一題】(287)障壁島
    格陵蘭島的冰山【每日一題】(192)衝越扇【每日一題】(193)高山出好茶【每日一題】(194)綠色圓形農田【每日一題】(195)珊瑚礁形態與風向關係【每日一題】>【每日一題】(226)「地冰花」【每日一題】(227)阿特拉斯山【每日一題】(228)油橄欖【每日一題】(229)雪花形態【每日一題】(230)「地穿甲現象」
  • 【每日一題】(245)馬拉開波湖
    )特殊的瀑布【每日一題】(190)湧潮【每日一題】(191)格陵蘭島的冰山【每日一題】(192)衝越扇【每日一題】(193)高山出好茶【每日一題】(194)綠色圓形農田【每日一題】(195)珊瑚礁形態與風向關係【每日一題】(196)植物牆【每日一題】(197)棄風限電1【每日一題】(198)棄風限電2【每日一題】(199)棄風限電
  • 【每日一題】(869)比溼
    ——別讓未來的你,討厭現在的自己(溫馨提醒:由於微信改版,打亂了發布時間,為了保證大家可以及時看見老師的推送,可將本公眾號設為星標就可以第一時間看到推送哦)精選好題訓練思維據此完成12~13題。大家都在關注(超連結,可以查看早期全部內容)【每日一題】全部習題(862道)搜尋引擎【每日一題】《自然地理》分類整理搜尋引擎【每日一題】《人文地理》分類整理搜尋引擎【每日一題】《中國地理》分類整理搜尋引擎【每日一題】《世界地理》分類整理搜尋引擎
  • 星空每日一題20200324(數列與不等式)
    3.23開始,星空公眾號將發浙江溫州林熙皓老師負責編輯的每日一題
  • [每日一題]131. Palindrome Partitioning
    每日一題]162.Find Peak Element[每日一題]410. Split Array Largest Sum[每日一題]209. Minimum Size Subarray Sum[每日一題]240. Search a 2D Matrix II[每日一題]74.
  • 【每日一題】(907)蘭嶼島
    (溫馨提醒:由於微信改版,打亂了發布時間,為了保證大家可以及時看見老師的推送,可將本公眾號設為星標就可以第一時間看到推送哦)精選好題訓練思維15. 蘭嶼紅頭山熱帶季雨林,發育於山的西南面,主要是因為( )A.
  • 《龍族幻想》12月22日每日一題答案是什麼 每日一題答案分享
    導 讀 最近玩龍族幻想的玩家都在問,遊戲裡面每日一題答案是什麼了,今天的問題是誰降臨幻境之海,在平行世界掀起軒然大波
  • 再見, 數學分析每日一題
    曾無數次地想這天快點來到, 因為每日的堅持確實太累. 今天它真來了, 卻帶來的是些許傷感. 想到 2021 考研的路程才剛剛過半, 之後還有半年的時間陪伴大家一起進行強化衝刺, 內心也是充滿了期待. 每日一題的結束只是代表課本的學習該結束了, 而真正的考研廝殺才剛剛開始, 所以親愛的你們不能有絲毫的懈怠, 接下來該你們閃亮登場了!120 天, 揚哥經歷了很多.
  • 每日一題 | 高等動、植物細胞亞顯微結構圖,考生必看!
    本題以高等動、植物細胞亞顯微結構圖為背景,考查學生從材料中獲取信息的能力和對知識的理解遷移能力,難度中等。▍本文編輯:生物姐▍來源:本文來源網絡,版權歸相關權利人所有,如侵權,請聯繫刪除。大家在生物學習過程中還有哪方面知識學起來比較吃力,歡迎給生物姐留言,生物姐會盡力幫助大家。
  • [每日一題]140. Word Break II
    Palindrome Partitioning[每日一題]139. Word Break[每日一題]357. Count Numbers with Unique Digits[每日一題]78. Subsets[每日一題]79.
  • 錯題分析|張之毓、楊惠雯、黃梓瑞(附每日一題)
    我們在平時的學習中,應該更關注錯題的分析和理解,因為這是同學們容易出錯的地方,也是知識掌握和理解不到位的地方。     所以,遇到錯題的時候,我們應該分三步來分析:一、我為什麼會做錯?二、正確的思考方法和解題思路應該是怎麼樣的?三、從中我吸取了什麼教訓、獲得了什麼經驗?     如果同學們在對待每一個錯題時都能如此分析總結,相信以後就不會再犯同樣的錯誤了。
  • 2019高考語文每日一題(52-53):創新題型(六)
    【編者按】昨天和今天是高考倒計時4-5天,公號繼續推出2019高三語文每日一題第52-53題,內容繼續推送《創新型題目》。
  • 《三國殺》1月5日每日一題答案是什麼 每日一題答案分享
    導 讀 三國殺1月5日每日一題問題 下列武將中,沒有改版新武將的是哪位?
  • 等高線圖【每日一題2919.7.23】
    準備迎接今天的刷題吧!歡迎大家留言打卡打卡格式:DAY+打卡天數+答案及解題思路每月堅持打卡滿一個月的同學並且轉發朋友圈15天在月末將獲得錯題本注意是所有同學有些同學會因為學校原因無法打卡,可在每星期休息時間進行補打卡。
  • 微博森林驛站每日一題答案是什麼
    註:本文轉載自網絡,不代表本平臺立場,僅供讀者參考,著作權屬歸原創者所有。我們分享此文出於傳播更多資訊之目的。如有侵權,請在後臺留言聯繫我們進行刪除,謝謝森林驛站是《微博》推出的一款類似螞蟻莊園的公益小遊戲,玩家可以通過收集愛心來幫助瀕危野生動物植物,遊戲中每天都會有一個百科性質的題目,答對即可獲得能量,很多小夥伴都想知道微博森林驛站每日一題答案是什麼?
  • 《拳皇98OL》11月26日每日一題答案是什麼 每日一題答案一覽
    導 讀 拳皇98ol和許多騰訊遊戲一樣,都有每日一題的活動。
  • 衝擊中考數學滿分每日一題(6)
    昨天每日一題答案1.如圖,⊙O是△ABC的外接圓,AC是直徑,過點O作OD⊥AB於點D,延長DO交⊙O於點P,過點P作PE⊥AC於點E,作射線DE交BC的延長線於點F,連接PF歡迎到洪老師講數學公眾號中查閱往期文章:1、江西中考多解問題試題集2、無刻度的直尺作圖三十四題免費贈送3、影子不在同一平面怎麼求物高