DP 合併石子

2021-07-29 23:51:33 字數 1082 閱讀 8189

矩陣連乘求最小相乘次數的問題和石子合併的問題思路是一樣的,而二者都是典型的dp

石子合併的問題:

問題描述

在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。

輸入格式

輸入第一行包含乙個整數n,表示石子的堆數。

接下來一行,包含n個整數,按順序給出每堆石子的大小 。

輸出格式

輸出乙個整數,表示合併的最小花費。

樣例輸入5

1 2 3 4 5

樣例輸出

33資料規模和約定

1<=n<=1000, 每堆石子至少1顆,最多10000顆。

宣告乙個二維陣列名為dp[i][j],為從第i堆合併到第j堆的最優解。

宣告乙個一維陣列名為stone[i],為每堆石子個數

宣告乙個一維陣列sum[i],為前i堆石子總數;

寫乙個三重迴圈,最外層為在有l堆石子的情況下進行的運算,2<=l<=n;

中間一層為l堆石子開始進行合併的起點記為i,

最內一層為在l堆石子開始進行合併的分割點記為t,

每次完成一組合併後,這組合並的總花費為min(dp[i][j],dp[i][t-1]+dp[t][j]+num[j]-num[i-1]),num[j]-num[i-1]是將最優的兩堆最終合併的那次操作的花費。

#include#includeusing namespace std;

const int max = 1<<30;

const int num = 10001;

int main();

int stone[n+1];

int sum[n+1]=;

for(i=1;i<=n;i++)

for(l=2;l<=n;l++)

}} }

cout<

一開始使用部落格本來是想記錄學習筆記的,後來總是覺得把會的東西寫下來有些浪費時間,說實話其實就是懶,結果斷斷續續也沒堅持下去,最終拖成這個樣子,實在慚愧,自信是靠實力拼來的,實力是靠努力得來的,加油吧,亡羊補牢為時不晚,人總是要有夢想的,我總不能讓夢想變成幻想吧。

dp 合併石子

靈活的dp啊。靈活的思路啊。怎樣去分析乙個你認為是用簡單dp解決的問題呢。就是把問題盡量想得簡單一點。舉個例子,把大象放進冰箱分為幾步 把大象的頭放進冰箱,把大象的尾巴放進冰箱。都是同樣的 放進冰箱 的操作,涉及的資料的規模變小了,這樣 步驟簡化 就可以有點思路。回到說這道題 你合併這11堆石子,你...

合併石子 dp

時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 7 提交 狀態 討論版 命題人 quanxing 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第...

石子合併 DP

題目 在乙個操場上一排地擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請設計乙個程式,計算出將n堆石子合併成一堆的最小得分。輸入每組資料第1行為乙個正整數n 2 n 100 以下n行,每行乙個正整數,小於10000,分...