動態規劃法 md

2021-07-02 22:45:27 字數 1097 閱讀 4431

動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解決將由上一次子問題的解推出。

例題:

題中所述的是在長度為n數字串中,新增k個乘號,將它分成k+1個部分,使得這k+1個部分的乘積最大

- 1.狀態及狀態轉移方程(根據子問題定義狀態)

首先要定義乙個「狀態」來代表它的子問題,並且找到它的解。分解出子問題:把前i個數字分成j部分,計算最大值。我們用sum[i][j]表示從第i位到第j位組成的數字;f[i][j]表示把前i個數字分成j份乘積的最大值,要求出j個部分的乘積最大值,再次分解子問題:把前k個數字分成j-1個部分(1<=k<=i-1),可以得出狀態轉移方程:f[i][j]=max(f[i][j],f[k][j-1]*sum[k+1][i]);(建議自己動手畫一下0~n簡圖,容易理解一些)

- 2.附加條件

需要根據實際情況考慮到可能存在的附加條件

例題中一定會有f[i][0]==sum[1][i];(1<=x<=n)

- 3.時間複雜度

根據程式實現,分析時間複雜度,本例:o(n^2*k)

總結:找到狀態是關鍵,由此推出狀態轉移方程。學會將大規模問題分解為子問題,根據子問題定義狀態

原始碼:

#include

#include

#include

using

namespace

std;

long

long f[41][7];

long

long sum[41][41];

char str[42];

#define max(a,b) (a>b? (a):(b))

int main()

for (i = 1; i <=n; i++)

}for (i = 1; i <= n; i++)

for (j = 1; j <= k; j++)

}cout

<< f[n][k];

system("pause");

return

0;}

附:

最長坡之問題

動態規劃法

在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...

動態規劃法

有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...

動態規劃法

最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...