石子合并(区间dp典型例题)
2024-09-05 01:48:15
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 ;
}
最新文章
- javascript中的scrollTop
- 移动端网站的内容触摸滑动-Swiper插件
- McCall的软件质量模型
- windows prompt personalize 设置cmd提示的相关
- in, out, ref
- Akka(8): 分布式运算:Remoting-远程查找式
- Sudoku Killer
- lambdas了解
- Windows使用Gitblit搭建Git服务器
- Numpy进阶操作
- js面向对象关键点
- java学习视频
- linux 3.10 gro的理解和改进
- 基于Java SE集合的图书管理系统
- ElasticSearch入门 第八篇:存储
- 新浪股票接口AndroidSDK
- Centos上Apache重启,mysql重启,nginx重启方法
- 关于equals与hashcode的重写
- 省队集训 Day4 a
- dubbox消费者启动成功,却无法连接注册中心
热门文章
- CSS-flex|gird 布局
- ios 富文本 加颜色 删除线
- c++中包含string成员的结构体拷贝导致的double free问题
- .NetCore 配合 Gitlab CI&;CD 实践 - 单体项目
- 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!
- Redis服务之Redis5集群相关命令说明
- 【模式识别与机器学习】——PCA与Kernel PCA介绍与对比
- Spring quartz中取得ServletContext
- tableau用户分类
- ElasticSearch 7.X版本19个常用的查询语句