原題
題解
這道題完全不需要貪心。
引理:1、紙牌一定可以分到一樣多。(題目條件)
2、相鄰兩堆牌間最多隻會移動紙牌一次。(最優方案)
每次移動可以看作相鄰兩堆中左邊一堆i往右邊一堆i+1移動x張
1)x>0 左往右移動1次
2)x<0 右往左移動1次
3)x=0 不移動。當且僅當此時牌堆1-i總牌數為i*總平均數張(牌堆1-i在之前的交換中紙牌總數保持不變)
此題並不需要太複雜的方法。
因為每堆牌只能移到相鄰的堆,不妨一堆堆處理,且只考慮後一堆(因為前一堆已經處理好了,再移動會造成浪費)。
那麼如果出現了負數呢?如1,1,7的情況,從左到右處理過程如下:
1,1,7
3,-1,7
3,3,3
但可以證明,這樣依然不會丟失最優解(只是改變了順序)。
動態規劃 思想
動態規劃 把問題劃分成子問題遞迴求解,並且保留中間結果以避免重複計算子問題的方法,叫動態規劃。eg 三角形路徑數字之和 關鍵思想 1,劃分成若干子問題 2,子問題的狀態,及若干狀態值 狀態的表述。3,子狀態之間的轉換 即遞迴求解,子狀態到上一級子狀態之間的變換關係 即如何從乙個或多個值已知的狀態,求...
動態規劃思想
1 解決問題 分治 用有限的計算能力處理大規模問題的基本手段 1.1 遞迴 問題的解決方法包含遞迴部分和非遞迴部分,非遞迴部分解決問題的一部分,減少問題規模,而遞迴部分將形式不變,但減小了規模的問題傳遞到下一輪解決中去。這樣,每一輪處理,問題都有一部分 規模 得到解決,一直遞迴下去 直到終止條件 直...
動態規劃的思想
動態規劃 dynamic programming 演算法是解決多階段決策過程最優化問題的一種常用方法,難度比較大,技巧性也很強。利用動態規劃演算法,可以優雅而高效地解決很多貪婪演算法或分治演算法不能解決的問題。動態規劃演算法的基本思想是 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後...