codevs 1048/洛谷 1880:石子归并
有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。
第一行一个整数n(n<=100)
第二行n个整数w1,w2...wn (wi <= 100)
一个整数表示最小合并代价
4
4 1 1 4
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:石子归并的更多相关文章
- [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版
codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...
- 洛谷P1880 石子合并(区间DP)(环形DP)
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...
- 洛谷1880 区间dp+记忆化搜索 合并石子
题目网址:https://www.luogu.com.cn/problem/P1880 题意是:给定一个序列,最小规则是相邻两个值的合并,开销是他们的和,将整个序列合并成一个值的情况下,求解该值的最小 ...
- 洛谷P1880 石子合并(环形石子合并 区间DP)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- 洛谷 P1880 石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 洛谷 P1080 石子合并 ( 区间DP )
题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成1堆 ...
- Codevs 3729==洛谷P1941 飞扬的小鸟
P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一 ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
随机推荐
- 分布式锁的三种实现方式 数据库、redis、zookeeper
版权声明: https://blog.csdn.net/wuzhiwei549/article/details/80692278 一.为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变 ...
- Codeforces Round #564 比赛总结
这次是中国大佬出题,结果被虐惨了. A. Nauuo and Votes #include<bits/stdc++.h> #define Rint register int using n ...
- 畅通工程续(HDU 1874)(简单最短路)
某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...
- c 判断数字是否有限
/* isfinite example */ #include <stdio.h> /* printf */ #include <math.h> /* isfinite, sq ...
- final关键字的理解
final :最终作为一个修饰符 1.可以修饰类,函数,变量: 2.被final修饰的类不可以被继承: 3.被final修饰的方法不可以被复写: 4.被final修饰的变量是一个常量,只能赋值一次,既 ...
- 编写第一个Servlet程序
在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面 将Tomcat的安装目录配置到Eclip ...
- Spring框架IOC解说
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...
- ICEM—倾斜孔
原视频下载:https://yunpan.cn/cS3UGMEscrYpL 访问密码 839b
- QThreadPool类和QtConcurrent命名空间
一.QThreadPool类 QThreadPool管理一组线程.它负责管理和回收单个QThread对象以减少程序中线程创建的开销.每个Qt应用程序都有一个全局的QThreadPool对象,可通过方 ...
- [Java]借助PrintWriter类和StringWriter类,取出异常堆栈信息放入字符串中
在程序开发中,有时我们不仅需要将异常堆栈信息打印在控制台里或是log里,可能还需要将它存在String中,再送到合适的地方,如错误页面,数据库等. 要取异常堆栈信息,具体的函数就是: /** * Ge ...