動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解決將由上一次子問題的解推出。
例題:
題中所述的是在長度為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...