練習2:在一組數中選擇幾個數字使其加起來和最大,但是選中的幾個數字不能相鄰,求最大的和
以以下這組資料舉栗子
我們依舊是之前的思想:選或者不選!!!!!!
依舊是最優解opt(i)代表到第i個元素最優解是什麼
+代表選擇第i個 -代表不選擇第i個
我們發現這個展開圖中依舊出現了重疊子問題 ,比如opt(3)和opt(4),那麼我們就可以採用動態規劃,避免使用遞迴重複計算
opt(i-2) + arr [i] ; //選擇第i個元素opt(i) = maxopt(i-1) //不選第i個元素這就是該問題的遞迴式,那麼遞迴出口應該是什麼呢?對了,當i=0時,opt(i)=arr[0] 或者當i=1時,opt(1) = max ( arr[0], arr[1] );okkkkk,問題分析清楚了,上**
//遞迴版本 時間複雜度o(2^n)
int recopt(int *arr,int i)
int main()
; int len=sizeof(arr)/sizeof(arr[0]);
cout<接著看非遞迴版本
int notrecopt(int *arr,int i)
演算法 動態規劃2
動態求解陣列中不相鄰元素最大和。import numpy as np arr 1 2,4 1,7 8,3 32,55 3,2 432,6 題目要求 從陣列中挑出不相鄰的元素加起來求sum的最大值 動態規劃 非遞迴 defdp opt arr 建立乙個arr長度大小的元素全部為0的陣列 arr是原陣列...
演算法導論 2 動態規劃
動態規劃與分治方法類似,都是通過組合子問題的解來求解原問題 需要注意的是,動態規劃 dynamic programming 這裡的programming並不是指編寫電腦程式,而是指一種 法 分治方法將問題劃分為互不相交的子問題,遞迴地求解子問題,再將它們的解組合起來,求出原問題的解 動態規劃也是通過...
動態規劃演算法2
今天用了遞迴來解決昨天鋼管的最有切割問題,如下 include include include using namespace std int cut rod int p,int n int p 1000 int main else return q 如果各位有好的計算時間的函式,或給陣列前幾個元素...