動態規劃嚴格上不是一種演算法,而是一種優化,用於去除重複計算。
看一道簡單的題目:
現在有編碼方式: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,單位為美元 鋼條...