問題:現在已知有乙個長度為n的切割杆,且1~n長度對應的價值儲存在prices[n]陣列中,將其進行若干次切割,求其達到的最大價值?
通過問題的敘述我們可以發現,和前一篇講解的動態規劃之二:剪繩子問題很相似,都屬於動態規劃的內容,因此我們就用動態規劃的思想來解決問題。
現在使用形式化語言來描述問題規模的最大價值狀態,即f(n)表示長度為n的切割杆的最大價值。prices[n]陣列中儲存對應長度為1~n的價值並且是隨機的,也就是說prices[2]的價值並不比prices[1]的價值大。因此假設我們第一次切割的長度為i,其最大價值為f(i),剩餘的切割杆的長度為n-i,其最大價值為f(n-i):
使用具體示例進行分析:
當n=0時,f(0)= 0;
當n=1時,f(1)= prices[0];
當n=2時,f(2)= max( prices[1] , f(1)+f(1) );
當n=3時,f(3)= max( prices[2] , f(1)+f(2) );
當n=4時,f(4)= max( prices[3] , f(1)+f(3) , f(2)+f(2) );
.......
f(n)=max( prices[n-1] , f(1)+f(n-1) , f(2)+f(n-2) , ...,f(i)+f(n-i) ) ( i>=0 && i
由此,我們可以知道狀態轉移函式為:f(n)= max( prices[n-1] , f(i) *+f(n-i) ) , 其中i的取值範圍為(i>0&&i<=n/2)。
程式結果如下:
#includeusing namespace std;
#define size 100 //**的大小
int line_max(int a, int n)
int main() ;
int prices[size];
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> prices[i];
for (int i = 1; i <= n; i++)
table[i] = prices[i-1];//對**用prices陣列進行初始化,用來儲存長度為i的最大乘積值
cout <<"長度為"
}
動態規劃 剪繩子
include include include using namespace std 題目 給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度為8時,我們把它剪成...
剪繩子動態規劃
題目 給你一根長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每一段的長度記為k 0 k 1 k m 請問k 0 xk 1 x.xk m 可能 的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18.我們有兩種不同的方法解決這...
剪繩子(貪心 動態規劃)
準備找工作,開始刷題,牛客劍指offer 給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 xk 1 x.xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到...