合并石子(dp)
2024-08-27 21:52:26
合并石子
时间限制: 1 Sec 内存限制: 128 MB
提交: 7 解决: 7
[提交][状态][讨论版][命题人:quanxing]
题目描述
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
计算出将N堆石子合并成一堆的最小得分。
输入
第一行为一个正整数N (2≤N≤100);
以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1≤i≤N)。
输出
一个正整数,即最小得分。
样例输入
7
13
7
8
16
21
4
18
样例输出
239
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<deque>
#define inf 0x3f3f3f3f
using namespace std;
int a[];
int dp[][];
//dp[i][j]是把第i堆推到第j堆得最优值
int s[];
int main()
{
int n;
cin>>n;
s[]=;
memset(dp,inf,sizeof(dp));
for(int i=;i<=n;i++)
{
cin>>a[i];
dp[i][i]=;
s[i]=s[i-]+a[i];
}
for(int i = n; i>=; i--)//不能反过来,因为,要在已知后面dp[i][k]+dp[k+1][j]的情况下推得
for(int j = i + ; j <= n; j++)
for(int k = i; k <= j - ; k++)
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+][j]+s[j]-s[i-]); cout<<dp[][n];
return ;
}
最新文章
- tab切换-2016.6.4
- 关于WEB Service&;WCF&;WebApi实现身份验证之WCF篇(2)
- Android APK反编译详解(附图)
- iOS 渐变提示。Labe自动换行
- [转载] HTTP请求的TCP瓶颈分析
- Python integer objects implementation
- 基于h5+ajax实现的手机定位
- IOS 实现QQ好友分组展开关闭功能
- RTTI-CLASS
- jquery选择器之层级过滤选择器
- Java 9 揭秘(2. 模块化系统)
- [THUWC2017]随机二分图
- 【转载】Pytorch tutorial 之Datar Loading and Processing
- BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
- 完全理解 Python 迭代对象、迭代器、生成器
- Docker备忘录
- BZOJ.4766.文艺计算姬(Prufer)
- Windows 7系统下安装和卸载删除IE的方法
- NOSQL学习之一:Memcached, Redis, MongoDB区别
- test20180919 递归问题
热门文章
- 更新CentOS 6.7源为阿里源
- Spring简洁版总结
- 实际工作中遇到关于Struts2线程安全的问题解决
- 【Python那些事儿之十】range()和xrange()
- Kinect 2.0 默认姿势的中文意思
- Appium 自动化测试(4)-- 脚本开发:官方demo演示 android_contacts.py
- lightoj1370欧拉函数/素数筛
- 51nod 1161 组合数,规律
- saltstack技术入门与实践
- ASP.NET MVC性能优化(实际项目中)