動態規劃(2)

2021-09-12 14:40:14 字數 1692 閱讀 9498

動態規劃一般只能應用於有最優子結構的問題。

最優子結構的意思是區域性最優解能決定全域性最

優解(對有些問題這個要求並不能完全滿足,

故有時需要引入一定的近似)。簡單地說,問

題能夠分解成子問題來解決。

動態規劃解題步驟(問題抽象化、建立模型、尋找約束條件、

判斷是否滿足最優性原理、找大問題與小問題的遞推關係式、

填表、尋找解組成,然後編寫**實現)

動態規劃演算法分以下4個步驟:

1.描述最優解的結構

2.遞迴定義最優解的值

3.按自底向上的方式計算最優解的值 //此3步構成動態規劃解的基礎。

4.由計算出的結果構造乙個最優解。 //此步如果只要求計算最優解的值時,可省略。

採用動態規劃方法的最優化問題的倆個要素最優子結構性質和子問題重疊性質。

最優子結構:

如果問題的最優解所包含的子問題的解也是最優的,

我們就稱該問題具有最優子結構性質(即滿足最優化原

理)。意思就是,總問題包含很多個子問題,而這些子

問題的解也是最優的。

重疊子問題:

子問題重疊性質是指在用遞迴演算法自頂向下對問題

進行求解時,每次產生的子問題並不總是新問題,有些

子問題會被重複計算多次。動態規劃演算法正是利用了這

種子問題的重疊性質,對每乙個子問題只計算一次,然

後將其計算結果儲存在乙個**中,當再次需要計算已

經計算過的子問題時,只是在**中簡單地檢視一下結

果,從而獲得較高的效率。*/

/*最長公共子串行(longest common sequence)和最長

公共子串(longest common substring)不一樣子序列:

即乙個給定的序列的子串行,就是將給定序列中零個或

多個元素去掉之後得到的結果子串:給定串中任意個連續

的字元組成的子串行稱為該串的子串。

/*lcs

#include #include using namespace std;

#define num 1010

int c[num][num];

int b[num][num];

void lcs_length(string x, string y);

void print_lcs(string x,int m, int n);

int main()

void lcs_length(string x, string y)

else if (c[i - 1][j] >= c[i][j - 1])

else

} }}void print_lcs(string x,int m, int n)

else if (b[m][n] == 2)

else

print_lcs(x, m, n - 1);

}*///揹包問題

#include using namespace std;

#define m 10010

int v[110][m]=;

int max(int a,int b)

int main()

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

for(j=0;j<=w;j++)

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

cout

}

動態規劃2

動態規劃是研究一類最優化問題的方法,在經濟 工程技術 企業管理 工農業生產及軍事等領域中都有廣泛的應用。近年來,在acm icpc中,使用動態規劃 或部分應用動態規劃思維 求解的題不僅常見,而且形式也多種多樣。而在與此相近的各類資訊學競賽中,應用動態規劃解題已經成為一種趨勢,這和動態規劃的優勢不無關...

動態規劃(2)

題目輸入格式 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2.r 1行 每行c個數,表示這個矩陣。輸出格式 僅一行 輸出1個整數,表示可以滑行的最大長度。樣例輸入 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 ...

動態規劃2

最長遞增子串行的問題 給定陣列arr,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為所以返回這個子串行的長度為5。解決方案 arr 2 1 5 3 6 4 8 9 7 dp 1 1 2 2 3 3 4 5 4 dp i 表示...