合并石子
来源:互联网 发布:新四大发明 知乎 编辑:程序博客网 时间:2024/05/17 06:37
Problem Description
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。
Input
输入有多组数据,每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。
Output
对于每组数据输出一个正整数,即最小得分
Sample Input
7
13
7
8
16
21
4
18
Sample Output
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。
Input
输入有多组数据,每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。
Output
对于每组数据输出一个正整数,即最小得分
Sample Input
7
13
7
8
16
21
4
18
Sample Output
239
#include<iostream> #include<stdio.h>using namespace std;#define M 104#define INF 1000000000int n,dp[M][M],sum[M],stone[M];inline int min(int a,int b){return a>b?b:a;}int main(){//freopen("b.txt","r",stdin);int i,j,k,t,len;while(scanf("%d",&n)==1){memset(sum,0,sizeof(sum));for(i=1;i<=n;i++){scanf("%d",&stone[i]);sum[i]=sum[i-1]+stone[i];}memset(dp,0,sizeof(dp));for(len=2;len<=n;len++)//归并的石子长度{for(i=1;i<=n-len+1;i++)//i为起点,j为终点{j=i+len-1;dp[i][j]=INF;for(k=i;k<=j;k++)dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);}}printf("%d\n",dp[1][n]); }return 0;}
0 0
- 石子-石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 【石子合并】
- 合并石子
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 石子合并
- 合并石子
- 石子合并
- 合并石子
- 杜汶泽挑衅大陆观众 《小团圆》无辜受害
- android中include和merge标记的区别和使用
- Java中创建URL的常见问题及解决方案
- sql server 字符串转成日期格式
- ARM汇编冒泡排序之c语言调用汇编
- 合并石子
- 比较R语言和集算器的向量运算
- ruby中的整数、浮点数、字符串之间的相互转换
- C#与java
- 函数数组
- <#if expression??>
- 设计模式系列课程14之【创建类模式总结】
- Android 获取手机信息
- vim中复制粘贴系统剪贴板内容