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. }


相关文章
|
3月前
acwing 836 合并区间
acwing 836 合并区间
16 1
acwing 836 合并区间
|
7月前
|
存储 算法
leetcode题解:88.合并有序数组
leetcode题解:88.合并有序数组
30 0
|
8月前
|
JavaScript
线性dp之石子合并
线性dp之石子合并
|
8月前
|
算法 搜索推荐 Java
算法编程(四):合并两个有序数组
算法编程(四):合并两个有序数组
80 0
|
存储 搜索推荐
合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
73 0
|
人工智能
1369:合并果子(fruit)
1369:合并果子(fruit)
114 0
|
人工智能
石子合并-区间dp
石子合并-区间dp
86 0
|
存储
两个有序表的合并(三种方法)
设有两个递增排列的有序表,要求合并后仍按递增(非递减)有序排列
1087 0
两个有序表的合并(三种方法)
每日一题——合并两个有序链表
每日一题——合并两个有序链表

热门文章

最新文章

下一篇
开通oss服务