Description

有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和。已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分。

Input

第一行一个整数n(1 <= n <= 200),表示石子堆数; 第二行n个整数a(1 <= a <= 100),表示每堆石子的个数。

Output

一个整数,表示最小总得分。

Sample Input

5
7 6 5 7 100

Sample Output

175

Source

Unknown
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
#define Inf 0x3f3f3f3f
const int maxn=1e5+;
typedef long long ll;
using namespace std;
int a[],g[][],sum[];
int dp[][];
int main()
{
int n;
cin>>n; for(int t=;t<=n;t++)
{
scanf("%d",&a[t]);
}
for(int t=;t<=n;t++)
{
sum[t]=sum[t-]+a[t];
}
memset(dp,Inf,sizeof(dp));
for(int t=;t<=n;t++)
{
for(int j=t;j<=n;j++)
{
g[t][j]=sum[j]-sum[t-];
}
}
for(int t=;t<=n;t++)
{
dp[t][t]=;
}
for(int l=;l<n;l++)
{
for(int j=;j+l<=n;j++)
{
int r=j+l;
for(int k=j;k<r;k++)
{
dp[j][r]=min(dp[j][r],dp[j][k]+dp[k+][r]+g[j][k]+g[k+][r]);
}
}
}
cout<<dp[][n]<<endl;
return ;
}

最新文章

  1. javascript中的scrollTop
  2. 移动端网站的内容触摸滑动-Swiper插件
  3. McCall的软件质量模型
  4. windows prompt personalize 设置cmd提示的相关
  5. in, out, ref
  6. Akka(8): 分布式运算:Remoting-远程查找式
  7. Sudoku Killer
  8. lambdas了解
  9. Windows使用Gitblit搭建Git服务器
  10. Numpy进阶操作
  11. js面向对象关键点
  12. java学习视频
  13. linux 3.10 gro的理解和改进
  14. 基于Java SE集合的图书管理系统
  15. ElasticSearch入门 第八篇:存储
  16. 新浪股票接口AndroidSDK
  17. Centos上Apache重启,mysql重启,nginx重启方法
  18. 关于equals与hashcode的重写
  19. 省队集训 Day4 a
  20. dubbox消费者启动成功,却无法连接注册中心

热门文章

  1. CSS-flex|gird 布局
  2. ios 富文本 加颜色 删除线
  3. c++中包含string成员的结构体拷贝导致的double free问题
  4. .NetCore 配合 Gitlab CI&amp;CD 实践 - 单体项目
  5. 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!
  6. Redis服务之Redis5集群相关命令说明
  7. 【模式识别与机器学习】——PCA与Kernel PCA介绍与对比
  8. Spring quartz中取得ServletContext
  9. tableau用户分类
  10. ElasticSearch 7.X版本19个常用的查询语句