题目描述 Description

有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。

输入描述 Input Description

第一行一个整数n(n<=100)

第二行n个整数w1,w2...wn  (wi <= 100)

输出描述 Output Description

一个整数表示最小合并代价

样例输入 Sample Input

4

4 1 1 4

样例输出 Sample Output

18

  芒果君:这是我博客的第一道题啊~是一道DP啊~其实刚看到的时候有点懵,然后又看了一本通上的代码,果然,我并没有恍然大悟OTZ  用f[i][j]表示从第i个到第j个的最小合并代价,状态转移方程是,f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]),就是判断原来的方案和你枚举的新的两端合并起来哪个更小。然后这道题也告诉我memset新的用法……

#include<cstdio>
#include<cstring>
using namespace std;
int f[][],s[],n,i,j,k,x;
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
scanf("%d",&n);
for(i=;i<=n;++i)
{
scanf("%d",&x);
s[i]=s[i-]+x;//求前缀和
}
memset(f,/,sizeof(f));//把每一位都赋予一个很大的整数
for(i=;i<=n;++i)
{
f[i][i]=;//自己合并自己花费是0
}
for(i=n-;i>=;--i)//合并2个、合并3个……合并n个
{
for(j=i+;j<=n;++j)//枚举长度
{
for(k=i;k<=j-;++k)//把这个长度里划成两段
{
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]+s[j]-s[i-]);
}
}
}
printf("%d",f[][n]);
return ;
}

  

  然后这道题还有一个升级版,就是洛谷的1880,只不过把这个链状的变成了环状的,最大值和最小值都要求,我就稍微改了一下,比如第一次做“1 2 3 4 5”,第二次做“2 3 4 5 1”,第五次做“5 1 2 3 4”,这样就解决问题了。

#include<cstdio>
#include<cstring>
using namespace std;
int f1[][],f2[][],a[],s[],n,i,j,k,t,x,MIN=<<,MAX;
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
scanf("%d",&n);
for(i=;i<=n;++i)
{
scanf("%d",&a[i]);
}
for(t=;t<=n;++t)
{
for(i=;i<t;++i)
{
s[i]=s[i-]+a[n+i-t+];
}
for(i=t;i<=n;++i)
{
s[i]=s[i-]+a[i-t+];
}
memset(f1,/,sizeof(f1));
memset(f2,,sizeof(f2));
for(i=;i<=n;++i)
{
f1[i][i]=;
f2[i][i]=;
}
for(i=n-;i>=;--i)
{
for(j=i+;j<=n;++j)
{
for(k=i;k<=j-;++k)
{
f1[i][j]=min(f1[i][j],f1[i][k]+f1[k+][j]+s[j]-s[i-]);
f2[i][j]=max(f2[i][j],f2[i][k]+f2[k+][j]+s[j]-s[i-]);
}
}
}
MIN=min(f1[][n],MIN);
MAX=max(f2[][n],MAX);
}
printf("%d\n%d\n",MIN,MAX);
return ;
}

codevs 1048/洛谷 1880:石子归并的更多相关文章

  1. [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版

    codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...

  2. 洛谷P1880 石子合并(区间DP)(环形DP)

    To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...

  3. 洛谷1880 区间dp+记忆化搜索 合并石子

    题目网址:https://www.luogu.com.cn/problem/P1880 题意是:给定一个序列,最小规则是相邻两个值的合并,开销是他们的和,将整个序列合并成一个值的情况下,求解该值的最小 ...

  4. 洛谷P1880 石子合并(环形石子合并 区间DP)

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  5. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  6. 洛谷 P1880 石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  7. 洛谷 P1080 石子合并 ( 区间DP )

    题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成1堆 ...

  8. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 Flappy Bird 是一 ...

  9. CODEVS 1066/洛谷 P1514引水入城

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在一个遥远的国 ...

随机推荐

  1. myEclipse设置

    字符集设置 点击菜单:window——preferences 输入:Workspace 字体大小设置 输入:colors and fonts 本机字体:14 显示行号 输入:Text Editors ...

  2. javaMail 详解

    原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html 一.JavaMail API简介JavaMail API是读取. ...

  3. 让JPA的Query查询接口返回Map对象

    在JPA 2.0 中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句. 但当我们查询结果没有对应实体类时,query.getResultList() ...

  4. 047_批量下载有序文件(pdf、图片、视频等等)

    #!/bin/bash#本脚本准备有序的网络资料进行批量下载操作(如 01.jpg,02.jpg,03.jpg)#设置资源来源的域名连接 url="http://www.test.com/& ...

  5. 046_Shell 脚本的 fork 炸弹

    #!/bin/bash#快速消耗计算机资源,致使计算机死机#定义函数名为.(点), 函数中递归调用自己并放入后台执行.() {.|.& };.

  6. 2019.7.9 校内测试 T2 极值问题

    这一次是交流测试?边交流边测试(滑稽 极值问题 乍一看这是一道数学题,因为1e9的数据让我暴力的心退却. 数学又不好,不会化简式子嘞,咋办? 不怕,咱会打表找规律.(考场上真的是打表找出了规律,打表打 ...

  7. SSRF漏洞攻击利用从浅到深

    梳理一下ssrf 不详细 简单记录 0x01 SSRF成因和基本利用0x02 内网打未授权redis0x03 关于ssrf打授权的redis0x04 写redis shell和密钥的一点问题0x05 ...

  8. java 生成随机数 自定义

    public static void main(String[] args) { int max=10000; int min=1000; Random random = new Random(); ...

  9. postgresql could not connect to server

    问题: postgresql部署在linux上,在自己电脑上使用pgadmin连接出现could not connect to server错误 问题分析: 出现上述原因有3种情况 1.linux上的 ...

  10. Dubbo系列(三)dubbo的核心技术--RPC调用

    dubbo的核心技术--RPC调用:分为俩部分RPC协议Protocol和方法调用Invoke: 一.RPC协议Protocol(Remote Procedure Call)远程过程调用协议 1.我们 ...