動態規劃之三 剪繩子變形之切割杆

2021-08-18 21:34:49 字數 1191 閱讀 1888

問題:現在已知有乙個長度為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的三段,此時得到...