問題描述
在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。
輸入格式:
輸入第一行包含乙個整數n,表示石子的堆數。
接下來一行,包含n個整數,按順序給出每堆石子的大小 。
輸出格式:
輸出乙個整數,表示合併的最小花費。
樣例輸入
51 2 3 4 5
樣例輸出
33資料規模和約定
1<=n<=1000, 每堆石子至少1顆,最多10000顆。
對於dp本人還在學習中,對於蒟蒻的我來說dp還是有點難下手的還需要多練習借鑑,記錄一下此題對dp的看法及過程首先先看此題題解,對於不同堆的石子合併需要知道每次選取的最小花費方式以及總石子數,用於判斷下次是否選取(兩表分開看有助於理解)
動態方程設定為 dp[i][j]為從第i堆到第j堆的最小花費 sum[i][j]為從第i堆到第j堆石子總數
對於圖中條件需要自己推理一遍才能理解下述**的用途,這也是dp演算法最主要的一步,找到問題解決式
如果大家自己推不出來表,我推薦大家可以看一下這個分析
再推完上述**後,接下來上**
#include
using
namespace std;
voidf(
);#define max 999999999
//定義乙個最大值,方便資料寫進表中
int dp[
1001][
1001]=
;//初始化**中最小花費
int num[
1001];
int sum[
1001][
1001];
//石子數
int n;
intmain()
f();
return0;
}voidf(
)}//遍歷所有情況進行比較,讀入最小花費值
for( j=
2;j<=n;j++
) dp[i]
[j]=min1;}}
cout<
[n];
}
DP 合併石子
矩陣連乘求最小相乘次數的問題和石子合併的問題思路是一樣的,而二者都是典型的dp 石子合併的問題 問題描述 在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。輸入格式 輸入第一行包含乙個整數n...
dp 合併石子
靈活的dp啊。靈活的思路啊。怎樣去分析乙個你認為是用簡單dp解決的問題呢。就是把問題盡量想得簡單一點。舉個例子,把大象放進冰箱分為幾步 把大象的頭放進冰箱,把大象的尾巴放進冰箱。都是同樣的 放進冰箱 的操作,涉及的資料的規模變小了,這樣 步驟簡化 就可以有點思路。回到說這道題 你合併這11堆石子,你...
合併石子 dp
時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 7 提交 狀態 討論版 命題人 quanxing 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第...