石子合併問題
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堆石子排成一條直線 這個問題比較簡單,類...