下面是紫書上講的常用演算法設計策略和優化策略:
拆分出的狀態必須滿足最優子結構性質和無後效性(當前階段以前的狀態不會影響以後的狀態,只與當前階段有關)。動歸的目的是避免重疊子問題。遞推和遞迴(記憶化搜尋)是實現動歸的手段。
只要滿足:1.狀態設計不重不漏 2.轉移方程正確 3.能順利統計答案,那麼這個dp就是可寫的。如果在碼**的時候, 初始狀態的值設定對了,同時考慮了邊界情況,那麼這個dp**就是正確的。
決策單調性:第i個階段,如果從j轉移,那麼i以後的階段,都不會從j及以前的階段轉移。
做題的時候可以考慮先寫出原始的轉移方程,再用各種方法優化,如將一些一環扣一環的轉移壓縮成乙個轉移/利用字首和思想/利用單調佇列或者優先佇列/利用線段樹……
貪心法:動態規劃的一種,每個階段的最優解是由上乙個階段的最優解得到的。貪心的情況下,區域性最優解構成了全域性最優解。在找出動態規劃的方法以後可以嘗試貪心解法。
收縮法:對於某些問題,可以用反證法證明答案只會收縮到某些邊界處,判斷邊界情況即可。
構造法:最樸素的方法。包括模擬,暴力,暴搜……
等價轉換:化繁為簡,包括問題轉換,問題分解等。例如最值反演。
假設法:對於有對稱性的問題,利用對稱性避免討論。
使用資料結構:在不改變主演算法的情況下加速演算法。包括但不限於並查集,單調x,平衡樹,線段樹,lct……
數形結合:將代數的關係轉化成幾何的關係。
二分答案:將求某個最優值問題轉化為判定性問題,也算在策略內。它的衍生演算法還有整體二分,即把詢問和答案一起二分。
掃瞄法:帶有順序的列舉法,通常維護一些重要的量從而簡化計算。
列舉基準:尋找基於當前基準的最優值,再取所有基準的最值。某些看似狀壓的題可以用這種方法,在外層列舉基準狀態,然後神奇解決……
演算法優化 遞迴演算法的優化策略
在處理演算法問題時候,用的非常多的一種策略就是遞迴演算法了。但是遞迴演算法雖然簡單有效,但是該演算法的演算法效果總是有點差強人意。本文主要講述從兩個方向優化遞迴演算法,希望本文能給讀者一些thinking。持續更新中 總結 示例 遞迴演算法我又把它稱為迭代演算法,因為大致思路都差不多 迭代 從已知推...
優化演算法之進化策略
clear all clc close all 進化策略解決旅行商問題 t0 clock n 10 初始種群規模 c 1,2 70,90 80,60 10,100 800,200 800,100 90,80 200,600 230,4 500,90 城市座標 m size c,1 城市個數 for ...
演算法分析與優化策略
一 漸進時間複雜度 基本操作的數量往往可以寫成關於 輸入規模 的表示式,保留最大項並忽略係數後的簡單表示式稱為演算法的漸進複雜度,用於衡量基本運算元隨規模的增長情況。例如 設輸入規模為n時加法操作的次數為t n t n n n 1 n 2 6。當n很大時,平方項和一次項對整個多項式的影響不大,可以用...