所以這是一個相當有名的實施DP的例子,但由於某些原因,我不能完全理解算法,並且我一直堅持它很長一段時間(準備計算奧林匹克)。問題如下酒選擇動態編程
想象一下,你有N個葡萄酒在 架子上相鄰放置。爲了簡單起見,我們將葡萄酒從左至右編號爲 ,它們分別站在貨架上,整數分別爲1至N, 。第i種葡萄酒的價格是pi(不同 葡萄酒的價格可能不同)。
因爲葡萄酒每年都變得更好,假設今天是一年 1,在年份y的第i個葡萄酒的價格將Y * PI,即本年度 值即Y型倍。
你想賣掉你所有的葡萄酒,但是你想從今年開始每年銷售一種葡萄酒 。還有一個制約因素 - 每年 您只能出售架子上最左邊的或最右邊的葡萄酒,而且您不能在架子上重新訂購 葡萄酒(即它們必須保持與它們相同的順序)開始時爲 )。
你要搞清楚,什麼是最大的利潤,你可以得到,如果你 的最優順序
而且在C解決方案銷售的葡萄酒++給出(沒有與記憶化,但一個解決方案几乎不成問題對我的疑問):
int p[N]; // read-only array of wine prices
// year represents the current year (starts with 1)
// [be, en] represents the interval of the unsold wines on the shelf
int profit(int year, int be, int en) {
// there are no more wines on the shelf
if (be > en)
return 0;
// try to sell the leftmost or the rightmost wine, recursively calculate the
// answer and return the better one
return max(
profit(year+1, be+1, en) + year * p[be],
profit(year+1, be, en-1) + year * p[en]);
}
主要困惑我已經是關係到我們using.As據我能理解MAX()函數,遞歸利潤()函數計算什麼是總如果我們在去年銷售葡萄酒1,那麼利潤是多少?如果我們在去年銷售了葡萄酒2,那麼可以說葡萄酒1的總利潤更高,如果它在晚些時候賣出,那麼我們實際上不應該保留葡萄酒1(因爲它會在以後爲我們帶來更多利潤)並出售葡萄酒2(因爲它會獲得比葡萄酒少的利潤1),還是有我沒有得到的東西?
「有一種解決方案,但這對我的疑問並不重要」,這個動態規劃是一種記憶;如果你忽略它只是一個非常低效的算法。 – Yakk
@Yakk OP本身沒有DP問題,但在如何獲得這個問題的遞歸公式。因此,他認爲記憶對他的具體問題無關緊要。 – fjardon