動態規劃方法通常用來求解最優化問題,這些問題有很多種解,但我們希望尋求最優解。
滿足兩個條件既可以使用動態規劃
1.具有最優子結構
2.子問題重疊
至於這兩點是什麼意思?先看個問題
現在有個鋼筋長度和**對應的表,問:給你個長度為n的鋼筋怎麼賣最划算?
長度1 2 3 4 5 6 7 8 9 10
**1 5 8 9 10 17 17 20 24 30
現在就是要把所有的切法都遍歷一遍,找出最划算的切法,當你把鋼筋切了一刀後,是不是變成了兩段?那就要考慮的就是這兩段怎麼切最划算,這樣會比較複雜,不妨我們這樣:
把鋼筋切一刀,成兩半,但左邊那一半不在考慮,直接按**賣出,只考慮右邊那一半,這樣是不是比較簡單?當然為了遍歷所有切法,左邊那部分是從1到n遞增的。然而現在我們現在的問題就是變成切一條鋼筋,左邊不動,把右邊又看成一條獨立的鋼筋切,左邊不動,把右邊....是不是有遞迴的味道了?像這樣一直重複的解決同一種問題(把右邊的鋼筋獨立看成獨立的一條鋼筋,繼續切)就叫做子問題重疊。
至於什麼是最優子結構?顧名思義就是子問題的最優解就是問題的最優解。什麼意思?就是如果把鋼筋分成a和b兩段,那麼a的最優解和b的最優解合起來就是原問題的最優解..
有人說這不是廢話麼?來看乙個例子
現在有乙個正方形,頂點為a,b,c,d,要求a->c的最短路徑,是不是可以分成a->b和b->c兩個子問題?a->b的最短路徑當然是a->b啦,那麼合起來路徑就是a->b->c,這個符合最優子結構。
但是要求a->b的最長路徑呢?假如按照子問題方法求解的話我們又會分成a->c和c->b兩個子問題,a->c的最長路徑為a->d->c,同理c->b的最長路徑為c->d->a->b
,那麼最長路徑是不是a->b?顯然不是,所以這個就不滿足最優子結構。
下面是實現的**
static void main(string args)
;
int n=convert.toint32(console.readline());
datetime stardt = datetime.now;
int maxp=cutrod(p,n);
datetime enddt = datetime.now;
timespan st = enddt - stardt;
console.writeline(maxp);//最優值
console.writeline(st);//消耗時間
}public static int cutrod(int p, int n)
else
return q;
}
} public static int max(int a1, int a2)
上面的這個自頂向下方法會重複的計算一些子問題,導致時間複雜度較大,想要改善的話,就增加備忘錄,就是當求出那些子問題的時候,用個資料結構把它記下來,下次要用到就直接讀取就行。還有一種方法是自低向上,其實原理都是一樣,就是用空間換時間
static void main(string args)
;int n=convert.toint32(console.readline());
int r = new int[n+1];
r[0] = 0;
for (int i = 1; i <= n; i++)
datetime stardt = datetime.now;
bottomupcutrod(p,n,r);
datetime enddt = datetime.now;
timespan st=enddt-stardt;
console.writeline(r[n]); //輸出最優值
console.writeline(st);// 消耗時間
}public static void bottomupcutrod(int p,int n,int r)
r[i] = q;}}
public static int max(int a, int b)
就這樣~
動態規劃問題二簡單理解
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。問題解釋 房屋用非...
簡單粗暴地理解動態規劃
動態規劃可以說是做題時比較難以理解的演算法了,我之前也不是很理解,直到在隨機過程中學習了馬爾科夫過程後,再看動態規劃就覺得很簡單了。本文只是幫助簡單粗暴的理解動態規劃,熟練地運用需要親自進行大量的習題練習。一 動態規劃適合解決什麼樣的問題?1 問題具有最優子結構 舉乙個直白易懂的例子 求你走路的時候...
如何簡單的理解動態規劃?
動態規劃是一種類似於回溯的思想,他通過空間換時間的方法提高效率,一般用於求最優解問題。在上面我說道,動態規劃其實和回溯很類似。回溯思想在前面的文章我提到過,回溯是一種窮舉可能的方法。動態規劃則是通過額外的空間將回溯的遞迴樹中不需要的可能提前剪除達到提高效率的目的。我們來回憶一下回溯能解決的問題的特徵...