石子合併問題 DP演算法

2021-09-19 01:10:50 字數 1210 閱讀 8076

石子合併問題

time limit: 1000 ms memory limit: 65536 kib

problem description

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。

對於給定n堆石子,計算合併成一堆的最小得分和最大得分。

input

輸入資料的第1行是正整數n,1≤n≤100,表示有n堆石子。第二行有n個數,分別表示每堆石子的個數。

output

輸出資料有兩行,第1行中的數是最小得分,第2行中的數是最大得分。

sample input

44 4 5 9

sample output

4354

hint

source

這個演算法還是看了很多大佬的其他演算法才明白的,畢竟自己太菜了,不是演算法的料。

#include using namespace std;

int maxx = 0,minn = 65535;

/***************************

////當石子為1堆時,無法合併,得分為0

//當石子為2堆時,只有一種合併方式,得分即為兩者相加

//當石子為3堆時,要不就是前兩者合併,最後一堆不合併,要不就是後兩者合併,第一堆不合併

//當石子為4時,同理.....

**************************/

int find_max(int a,int n)

//三堆及以上石子合併,從3到n堆石子

for(int r = 3; r <= n; r++)}}

return m[1][n];

}/***************************

////找最大得分同理

**************************/

int find_min(int a,int n)

//三堆及以上石子合併

for(int r = 3; r <= n; r++)}}

//minn = m[1][n];

return m[1][n];

}int main()

cout

}

dp演算法 石子合併問題

這兩天看了一下這個問題,原題是這樣的 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動相鄰的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 這個題目在第一次剛看的時候,一臉懵逼,題目看懂了,但是怎麼去求花費怎麼都沒有想明白,後來在網上看了一...

dp 石子合併問題

問題描述 在乙個圓形操場的四周擺放著n 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰 的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。程式設計任務 試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。資料輸入 包含兩行,第1 行是正整數n 1 n 100 ...

dp 石子合併問題

石子合併問題 有n n 100 堆石子,價值分別為a0,a1.a n 1 每次將其中的相鄰的兩堆合併,合併的代價為兩堆石子的價值和,合併後用合併之後的一堆石子代替之前的兩堆石子,價值為原來 兩堆價值之和,求最終將所有的石子合併成一堆之後的代價最小值。問題一 n堆石子排成一條直線 這個問題比較簡單,類...