1274:【例9.18】合并石子

简介: 1274:【例9.18】合并石子

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

计算出将N堆石子合并成一堆的最小得分。

【输入】

第一行为一个正整数N (2≤N≤100);

以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1≤i≤N)。

【输出】

一个正整数,即最小得分。

【输入样例】

7

13

7

8

16

21

4

18

【输出样例】

239

1. #include <iostream>
2. #include <cstdio>
3. #include <cstring>
4. #include <algorithm>
5. #define INF 0x3f3f3f3f
6. using namespace std;
7. int f[101][101];
8. int s[101];
9. int n,i,j,k,x;
10. void print()
11. {
12.   for(i=1;i<=n;i++){
13.     for(j=1;j<=n;j++)
14.       printf("%10d ",f[i][j]);
15.     printf("\n");
16.   }
17.   printf("\n");
18. }
19. int main()
20. {
21.   memset(f,INF,sizeof(f));
22.   scanf("%d",&n);
23.   for(i=1;i<=n;i++){
24.     scanf("%d",&x);
25.     s[i]=s[i-1]+x;
26.     f[i][i]=0;
27.   } 
28.   for(i=n-1;i>=1;i--){
29.     for(j=i+1;j<=n;j++)
30.       for(k=i;k<=j-1;k++)
31.         f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
32.   }
33.   //print();
34.   printf("%d\n",f[1][n]); 
35.   return 0;
36. }


相关文章
|
6月前
|
C++ Python
leetcode-56:合并区间
leetcode-56:合并区间
60 0
|
1月前
acwing 836 合并区间
acwing 836 合并区间
13 1
acwing 836 合并区间
|
1月前
|
C++
Leetcode第56题(合并区间)
这篇文章介绍了LeetCode第56题“合并区间”的解题方法,通过排序和贪心策略合并重叠区间,并提供了C++的代码实现。
18 0
Leetcode第56题(合并区间)
|
3月前
|
算法
LeetCode第56题合并区间
LeetCode第56题"合并区间"的解题方法,通过排序区间并判断重叠后进行合并,有效解决了区间合并问题。
LeetCode第56题合并区间
|
6月前
|
JavaScript
线性dp之石子合并
线性dp之石子合并
|
6月前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
51 0
|
人工智能
1369:合并果子(fruit)
1369:合并果子(fruit)
104 0
|
人工智能
石子合并-区间dp
石子合并-区间dp
79 0
区间DP:合并石子
区间DP:合并石子
61 0