[JOYOI] 1055 沙子合并

原创 2018年04月17日 18:00:26
题目限制
时间限制    内存限制    评测方式    题目来源
1000ms  131072KiB   标准比较器   Local
题目描述
    设有N堆沙子排成一排,其编号为123,…,NN<=300)。每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆沙子的数量之和,合并后与这两堆沙子相邻的沙子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同,如有4堆沙子分别为 1  3  5  2 我们可以先合并12堆,代价为4,得到4 5 2 又合并 12堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24,如果第二步是先合并23堆,则代价为7,得到4 7,最后一次合并代价为11,总代价为4+7+11=22;问题是:找出一种合理的方法,使总的代价最小。输出最小代价。

输入格式
第一行一个数N表示沙子的堆数N。
第二行N个数,表示每堆沙子的质量。 <=1000

输出格式
合并的最小代价

样例数据
输入样例 #1 输出样例 #1
4
1 3 5 2
22

基本的区间DP,枚举断点。

#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int MAXN=505;

inline int rd(){
    int ret=0,f=1;char c;
    while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
    while(isdigit(c)){
        ret=ret*10+c-'0';
        c=getchar();
    }
    return ret*f;
}

int n;
int s[MAXN],f[MAXN][MAXN];

int main(){
    memset(f,0x3f,sizeof(f));
    n=rd();int x;
    for(int i=1;i<=n;i++)
        x=rd(),s[i]=s[i-1]+x,f[i][i]=0;
    for(int len=1;len<=n;len++){
        for(int i=1;i<=n-len;i++){
            int j=i+len;
            for(int k=i;k<=j;k++){
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
            }
        }
    }
    cout<<f[1][n]<<endl;

}
版权声明:If we go down then we go down together. https://blog.csdn.net/Gh0stCai/article/details/79978474

Java学习指南系列(Java快速入门)

这是Java学习指南系列课程的第1篇,介绍Java语言的入门语法,引领希望学习Java语言编程的初学者进入Java大门。本课程不需要其他语言作为基础,可以直接学习。课程从Java开发平台的下载和安装开始,从浅到深、从易到难,循序渐进地进行语法讲解。为了让学员更好的掌握Java语言,本课程配套在线的Java题库及答案解析。相比于其他语言,Java语言更科学、更容易掌握,快来和大家一起学习Java吧。
  • 2017年08月09日 15:30

joyoi1463 智商问题

http://www.elijahqi.win/2018/02/23/joyoi1463/ 各种数据结构帝~ 各种小姊妹帝~ 各种一遍AC帝~ 来吧! 题目描述 某个同学又有很多小姊妹了...
  • elijahqi
  • elijahqi
  • 2018-02-23 21:19:40
  • 10

|Tyvj|NOI1995|动态规划|P1055 沙子合并

http://tyvj.cn/p/1055 #include #include #include using namespace std; const int maxn = 1000 + 5; ...
  • Darost
  • Darost
  • 2016-08-05 15:29:55
  • 669

沙子合并 动态规划

链接网址:http://tyvj.cn/Problem_Show.asp?id=1055   #include #include using namespace std; const in...
  • yjyzsl
  • yjyzsl
  • 2012-08-14 17:04:24
  • 409

TYVJ 1055 沙子合并

题目描述         设有N堆沙子排成一排,其编号为1,2,3,…,N(N< =300)。每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并...
  • asdfghjkl1993
  • asdfghjkl1993
  • 2014-02-09 15:59:30
  • 1353

沙子合并

问题描述: 设有n堆沙子,其编号为A1,A2,A3……An,每堆沙子都有一定的数量,例如: 13  7  8  16  21  4  18 现在要将n堆沙子归并成一堆,归并的过程为每...
  • wdlsjdl2
  • wdlsjdl2
  • 2016-04-17 09:14:13
  • 506

tyvj 1055 沙子合并

#include #include #include #include #include #include #include #include #include #include ...
  • yueqiq
  • yueqiq
  • 2012-06-04 17:20:24
  • 529

沙子合并(又是区间动态规划)

#include using namespace std; long long a[305],d[305][305],s[305][305]; int main() { int n,i,j,k,r...
  • chenlang888
  • chenlang888
  • 2012-08-14 20:16:48
  • 624

Tyvj 1055 沙子合并 DP

#include #include #include using namespace std; #define inf 10000000 #define N 310 int a[N]; int sum...
  • ly1101001517
  • ly1101001517
  • 2014-03-12 00:03:24
  • 439

合并类动态规划,石子归并,合并石子解题报告

设有N堆沙子排成一排,其编号为1,2,3,…,N(N
  • txl16211
  • txl16211
  • 2014-10-30 19:47:36
  • 7023
收藏助手
不良信息举报
您举报文章:[JOYOI] 1055 沙子合并
举报原因:
原因补充:

(最多只允许输入30个字)