C C 五大常規演算法 動態規劃演算法

2021-10-05 23:04:22 字數 3870 閱讀 1610

人工智慧時代,各國都在大力研究機械人技術,也製造出各種各樣的機械人,比如:為了解決男女失衡而製造 的美女機械人,假如你參與了某美女機械人的研發,你在這個專案中要求實現乙個統計演算法:如果美女機械人 一次可以上 1 級台階,也可以一次上 2 級台階。求美女機械人走乙個 n 級台階總共有多少種走法。

咋一看,無從下手,不急,我們不是講了分治法嘛?這不是可以乘機表演一下? 啟發性思考:

分治法核心思想:從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題 比如總共有 5 級台階,求有多少種走法;由於機械人一次可以走兩級台階,也可以走一級台階,所以我們可以分成兩個情況

1、機械人最後一次走了兩級台階,問題變成了「走上乙個 3 級台階,有多少種走法?」

2、機械人最後一步走了一級台階,問題變成了「走乙個 4 級台階,有多少種走法?」

我們將求 n 級台階的共有多少種走法用 f(n) 來表示,則

f(n) = f(n-1) + f(n-2);

由上可得:

f(5) = f(4) + f(3);

f(4) = f(3) + f(2);

f(3) = f(2) + f(1);

邊界情況分析

走一步台階時,只有一種走法,所以 f(1)=1

走兩步台階時,有兩種走法,直接走 2 個台階,分兩次每次走 1 個台階,所以 f(2)=2

走兩個台階以上可以分解成上面的情況

這符合我們講解的分治法的思想:分而治之

參考:

#include

#include

/***********************************

* 遞迴實現機械人台階走法統計

* 引數:

* n - 台階個數

* 返回: 上台階總的走法

************************************/

intwalkcout

(int n)

else

if(n ==2)

/* 二級台階, 二種走法 */

else

/* n 級台階, n-1個台階走法 + n-2 個台階的走法 */

}int

main()

用圖理解一下但是,如果細心的朋友是否會注意到,上面的**中存在很多重複的計算?

比如: f(5) = f(4) + f(3) 計算分成兩個分支:

這裡可以觀察出用一些計算重複了非常多遍, 因此要用其他方法才行!!!

執行環境: vs 2019

執行結果:

其實我們可以從下向上分析推斷問題。

f(1) = 1

f(2) = 2

f(3) = f(1) + f(2) = 3

f(4) = f(3) + f(2) = 3 + 2 = 5

f(5) = f(4) + f(3) = 5 + 3 = 8

。。。依次類推 。。。

參考:

#include

#include

/***********************************

* 遞迴實現機械人台階走法統計

* 引數:

* n - 台階個數

* 返回: 上台階總的走法

************************************/

intwalkcout

(int n)

else

if(n ==2)

/* 二級台階, 二種走法 */

else

/* n 級台階, n-1個台階走法 + n-2 個台階的走法 */

}int

walkcout2

(int n)

ret = value[n]

; delete [

]value;

return ret;

}int

main()

system

("pause");

return0;

}

執行環境: vs 2019

執行結果:

輸入100

注意溢位

動態規劃也是一種分治思想,但與分治演算法不同的是,分治演算法是把原問題分解為若干子問題, 自頂向下,求解各子問題,合併子問題的解從而得到原問題的解。動態規劃也是自頂向下把原問 題分解為若干子問題,不同的是,然後自底向上,先求解最小的子問題,把結果儲存在**中, 在求解大的子問題時,直接從**中查詢小的子問題的解,避免重複計算,從而提高演算法效率。

什麼時候要用動態規劃?

如果要求乙個問題的最優解(通常是最大值或者最小值),而且該問題能夠分解成若干個子問題, 並且小問題之間也存在重疊的子問題,則考慮採用動態規劃。

怎麼使用動態規劃?

五步曲解決:

判題題意是否為找出乙個問題的最優解

從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題

從下往上分析問題 ,找出這些問題之間的關聯(狀態轉移方程)

討論底層的邊界問題

解決問題(通常使用陣列進行迭代求出最優解)

給你一根長度為 n 的金條,請把金條剪成 m 段 (m 和 n 都是整數,n>1 並且 m>1)每斷金條的 長度記為 k[0],k[1],…,k[m].請問 k[0] k[1]…*k[m]可能的最大乘積是多少?

參考:

#include

#include

intdemo1

(int length)

}//得到f(i)的最優解

products[i]

= maxmodify;

}//返回發f(n)

return products[length]

;delete

products;

}int

main()

學到的知識要, 多複習, 多總結, 多敲. 需要時間的積累, 才能引起質的改變. 自己寫不出來的永遠是別人的.

分享一下我的技巧: 代數法把具體的數字帶進去, 看看能能能找到規律(掌握思想).

還有就是畫圖, 也很重要. 用筆畫出來, 把數代進去, 方法雖然笨, 但真的很實用, 好記憶不如爛筆頭!!!

最近學作業系統我認為, 學什麼都要成本(時間), 即使它是免費的, 我個人認為要挑來學, 挑重點來學, 而不是從頭到尾, 除非考試考研.

今日是: 2023年5月11日, (由於疫情的原因), 家裡的很多弟弟現在才會學校, 只有兩位姐姐和我老表. 寫部落格,也可自己加強記憶,就當寫寫日記吧!!!

希望給個贊: 反正你又不虧, 順便而已

五大常用演算法之二 動態規劃演算法

文章 自 一 基本概念 動態規劃過程是 每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。二 基本思想與策略 基本思想與分治法類似,也是將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的...

五大常用演算法之二 動態規劃演算法

一 基本概念 動態規劃過程是 每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。二 基本思想與策略 基本思想與分治法類似,也是將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的解,為後一...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...