把問題拆分成若干個子問題,類似遞迴(分治),但是動規多用於處理最優解,有重疊子問題的問題,因為動態規劃對於重疊子問題不會反覆計算,會建立一張表將之前計算過的子問題答案直接儲存,避免了重複計算,加快計算速度
練習1:有8個任務,每個任務完成需要一定的時間,完成之後就會有相應的報酬(圖上的紅色字段),但是任務有時間點限制,比如第乙個任務在1點到4點。。。。任務之間不能併發,那麼乙個人做那幾個任務可以獲取到最高的報酬?
這個思想我們就用動態規劃,我們對於某乙個任務我們採取選與不選,看選的話獲取的報酬大還是不選獲取的報酬大,我們設定乙個表示式opt(i),表示到第i個任務的最優解。
比如:我們opt(8)就有兩種結果,一種是選擇了8號任務,那麼他就不能選擇6,7任務;若不選擇8號,那麼最優值就是opt(7),所以這個問題的遞迴式就是
選擇:vi + opt(i-x); //i-x是距離i之前最近的乙個可以選擇的任務,vi表示i任務的報酬opt(i)=max ; //每乙個任務的報酬int arr[8][2]=; //存放每乙個任務的開始與結束點vectorvec(8); //儲存每乙個任務距離他最近的前面的可以同時執行的任務下標
int i=0;
int j=0;
for(;i<8;i++)
} if(j<0)
vec[i]=-1;
} vectorsumval(8);
sumval[0]=val[0];
for(i=1;i<8;i++)
cout<對於遞迴版當然很好寫了
int getsumval(int i) }
int main()
{ cout<以上就是動態規劃的大致思想,就是杜絕這種重複的子問題多次計算!!!用表記錄,表填完的時候答案也就出來了
演算法1 動態規劃
動態規劃的步驟是 1.找出最優解的特徵,並刻畫其結構特徵 2.遞迴地定義最優值 3.以自底向上的方式計算出最優值 4.根據計算最優值的時得到的資訊,構造最優解。動態規劃演算法的有效性依賴於兩個最重要的性質 最優子結構性質和重疊子問題性質。栗子1,矩陣連乘問題。1 動態規劃 矩陣連乘問題 2 incl...
演算法筆記 動態規劃1
動態規劃適合求解最優問題,比如最大值最小值等。它可以顯著的降低時間複雜度,提高 的執行效率。0 1 揹包問題 在上篇總結中,用回溯演算法解決了 0 1揹包問題。但是,在求解的過程中,我們應該能想象的出,有些步驟是一直在重複執行。如果揹包的總載重為 9 物品個數為 5 質量分別為 2,2,4,6,3 ...
演算法筆記 動態規劃 1
求解方法 標準的01揹包問題是指,有n int型 個物品和最多裝重量w int型 的揹包。weight陣列表示物品的重量,即weight i 表示第i個物品的重量 value陣列表示物品的價值,即value i 表示第i個物品的價值。問把哪些物品裝入揹包使得物品價值總和最大,每個物品只能裝一次。舉例...