演算法優化之動態規劃

2021-08-24 20:37:37 字數 1054 閱讀 5386

動態規劃嚴格上不是一種演算法,而是一種優化,用於去除重複計算。

看一道簡單的題目:

現在有編碼方式:a->'1',b->'2'……z->'26',現給出乙個數串,要求有幾種解碼方式?

動態規劃考慮問題的基礎是分解問題,所以一種提倡的方式就是先寫遞迴形式,再轉成遞推。

而分解問題的要點是,不要執著於要一口氣得到最終解。所謂分解問題,就是降模,也就是在考慮n規模的時候,先考慮n-1的規模。

此時我們假設i規模的問題已解決【先將解決方法當成黑盒】,然後考慮i+1的規模。

帶入此題,假設我們已經求出前i個字元的劃分方式,在考慮第i+1個字元的時候,如果把第i+1個字元當成是被劃分出來的單個字元,那麼dp[i+1]=dp[i]。第二種情況,上述最大被劃分的數是26,最多兩位,所以兩位劃分的情況是10~26,特判一下ai和ai+1是否能構成滿足條件的數,滿足則dp[i+1]還需要累加上dp[i-1]。

**:#include

#include

using namespace std;

int dp[100];

char tar[100];

int main()

}printf("%d",dp[len]);

}不好意思上述**有問題,現在給出修正**:

修正1:字串從索引1開始儲存,前0個字元的劃分方式是1,不是0。

修正2:字元長度為1的邊界,直接列印1即可,不然在特判是否是兩位中低位的時候會越界。

修正3:字元0,只能作為兩位中的低位考慮,不能作為單字元劃分,因此單字元的情況下的初始值為0而不是dp[i-1]。

#include

#include

using namespace std;

int dp[100];

char tar[100];

int main() 

dp[1]=1;

int len=strlen(tar+1);

if(len==1)

for(int i=2;i<=len;i++)

}    

printf("%d",dp[len]);

}

演算法 動態規劃之斜率優化

斜率優化通常使用單調佇列輔助進行實現,用於優化 dp 的時間複雜度。使用單調佇列優化 dp 通常可以解決型如 dp i min f j g i 的狀態轉移方程。其中 f i 是只關於 i 的函式,g j 是只關於 j 的函式。樸素的解決方法是在第二層迴圈中列舉 j 來實現最小值,時間複雜度為 o n...

演算法之動態規劃

一 思想 首先要了解 動態規劃 必須先知道什麼叫做 多階段決策 百科裡面對這個問題解釋的很全,我就load一段出來,大家得要好好品味,好好分析。上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。二 使用規則 現在我們知道動態規劃要解決啥問題了,那麼什麼情況下我們該使用動態規劃呢?最優化原理 最優子...

演算法之動態規劃

鋼條切割問題 鋼條切割問題出現在 演算法導論 一書第204頁,作為動態規劃的例題出現,該題內容如下 serling公司購買長鋼條,將其切割為短鋼條 切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司 一段長為i英吋的鋼條的 為pi i 1,2,單位為美元 鋼條...