注:并非指專業(yè)名詞概念不好,而是認(rèn)為乍一接觸dp就開始啃那些難得名詞比較容易勸退,這里用簡單的思維理解來了解入門dp。
什么是動態(tài)規(guī)劃(dp)?
1.動態(tài)規(guī)劃是一種通過把原問題分解為相對簡單的子問題的方式求解復(fù)雜問題的方法。
2.由于動態(tài)規(guī)劃并不是某種具體的算法,而是一種解決特定問題的方法,因此它會出現(xiàn)在各式各樣的數(shù)據(jù)結(jié)構(gòu)中,與之相關(guān)的題目種類也更為繁雜。
例題
汗流浹背了嘛,哥們,沒關(guān)系接下來結(jié)合例題帶你走入dp
如何進(jìn)行動態(tài)規(guī)劃算法的實現(xiàn)?
首先創(chuàng)建一個dp表:
dp表???
dp表就是一個數(shù)組被命名為dp用來幫助我們進(jìn)行動態(tài)規(guī)劃的實現(xiàn),存儲分解的簡單子問題的狀態(tài)。
在這里這道題目中因為要求下一個泰波那契數(shù)需要前三個數(shù)據(jù),所以我們將泰波那契的每一個數(shù)存儲下來以用來后續(xù)使用
1.狀態(tài)表示
2.狀態(tài)轉(zhuǎn)移方程
3.初始化
4.填表順序
5.返回值
一般來說是通過上述五步來進(jìn)行實現(xiàn)動態(tài)規(guī)劃的算法,接下來我會通過簡單易懂的非官方語言講解五步。
1.狀態(tài)表示
狀態(tài)表示就是dp表內(nèi)數(shù)據(jù)所蘊含的意義,以例題中dp表中的數(shù)據(jù)意義就是第x個泰波那契數(shù)
一般來說狀態(tài)表示如何得到呢?
1.題目要求(題目直接給了)
2.經(jīng)驗+題目要求(多多的刷題)
3.分析題目的要求中發(fā)現(xiàn)的重復(fù)子問題(機靈的腦袋瓜分析)
2.狀態(tài)轉(zhuǎn)移方程
dp[i]該等于什么,或者說為dp[i]賦值的方式方法
該例題的狀態(tài)轉(zhuǎn)移方程就是前三個數(shù)據(jù)相加。
3.初始化
要通過對dp表初始化來保證使用方程填表時不越界,能運行的效果
例如本題的dp[0]dp[1]dp[2]三個數(shù)據(jù)是無法通過狀態(tài)轉(zhuǎn)移方程得到的,所以我們需要初始化這三個數(shù)據(jù)
4.填表順序
我們要選擇合適的填表順序使得通過狀態(tài)轉(zhuǎn)移方程來填表時能夠正常進(jìn)行,填寫當(dāng)前狀態(tài)時所需要的數(shù)據(jù)已經(jīng)知道。
此題中毫無疑問,我們應(yīng)該從dp[0]——>向dp[n]的方向移動順序填表.
5.返回值
從dp表中的數(shù)據(jù)結(jié)合題目要求,返回一個恰當(dāng)?shù)闹?/p>
此題中我們就恰好要返回dp[n]
例題代碼實現(xiàn)(非最簡最優(yōu),僅供參考)
class Solution {
public:
int tribonacci(int n) {
vector<int> dp={0,1,1};
for(int i=3;i<=n;i++)
{
dp.push_back(dp[i-1]+dp[i-3]+dp[i-2]);
}
return dp[n];
}
};
結(jié)尾
怎么樣學(xué)會了嘛,點個贊是對我最大的鼓勵。害怕自己忘記嘛,收藏一下吧,溫故才能知新呢。文章來源:http://www.zghlxwxcb.cn/news/detail-768740.html
我會接下來發(fā)布更多有用易懂的知識包括但不限于動態(tài)規(guī)劃相關(guān),貪心算法相關(guān)等各式實用有用算法以及編程語言語法等知識,感興趣請點個關(guān)注。文章來源地址http://www.zghlxwxcb.cn/news/detail-768740.html
到了這里,關(guān)于扔掉抽象難懂專業(yè)名詞,帶你從頭開始理解入門動態(tài)規(guī)劃1的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!