[动态规划] 石子合并

来源:互联网 发布:域名到期抢注 编辑:程序博客网 时间:2024/05/17 01:19

题目描述


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


输入输出格式


输入格式:
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.


输出格式:
输出共2行,第1行为最小得分,第2行为最大得分.


输入输出样例


输入样例
4
4 9 5 4
输出样例
43
54


该问题的关键在于分段讨论,先把1个,2个……n个石子合并的最优方法算出 

sum[i][j]=sum[i][j-1]+sum[(i+j-1)%n][1];

再根据

dp[i][j]=min/max(dp[i][j],dp[i][k]+dp[(i+k)%n][j-k]+sum[i][j])(sum表示从第i个石子堆合并j个的最优方案) 算出最后答案。


#include<iostream>using namespace std;int main(){    long long n,s[100][101],f[100][101],ss=0x7fffffff,s2=0;    scanf("%lld",&n);    for(int i=0;i<n;i++)    {        scanf("%lld",&s[i][1]);    }    for(int j=2;j<=n;j++)    {        for(int i=0;i<n;i++)        {            s[i][j]=s[i][j-1]+s[(i+j-1)%n][1];            f[i][j]=0x7fffffff;            for(int k=1;k<j;k++)             {                f[i][j]=min(f[i][j],f[i][k]+f[(i+k)%n][j-k]+s[i][j]);            }        }    }    long long f2[100][101];    for(int j=2;j<=n;j++)    {        for(int i=0;i<n;i++)        {            f2[i][j]=0;            for(int k=1;k<j;k++)            {                f2[i][j]=max(f2[i][j],f2[i][k]+f2[(i+k)%n][j-k]+s[i][j]);            }        }    }    for(int i=0;i<n;i++)    {ss=min(ss,f[i][n]);s2=max(s2,f2[i][n]);    }    printf("%lld %lld",ss,s2);}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 购买方发票联丢失怎么办 市中区超市办理发票怎么办 发票购买薄丢了怎么办 发票领用簿丢了怎么办 摩托车证扣12分怎么办 初中孩孑想扩展单词量怎么办 恒安保险倒闭了怎么办 小麦收割机卸粮筒总是转怎么办 非牛顿体结块了怎么办 非牛顿流体硬了怎么办 玩具枪子弹打到眼睛怎么办 杭州磨床7130噪音大怎么办 步兵太苦还有一年怎么办 检法事业编怎么办最新 河北省事业单位改企编制怎么办 梦飞去虎牙锐雯怎么办 蚂蚁借呗还款钱没到账怎么办 蚂蚁借呗没有按时还款怎么办 新装的win7没有网卡驱动怎么办 3d电影没眼睛怎么办 看vr手机发烫变卡怎么办 vr眼镜头晕想吐怎么办 程序员年龄大了失业怎么办 事业人员编制在机关任职改革怎么办 老公出轨死不承认怎么办 2017年军自考毕业证怎么办 大腿酸痛肌肉萎缩怎么办一 习惯不了军训一起洗澡怎么办 脚着凉了有点痛怎么办 腿着凉了膝盖疼怎么办 下雨了脚着凉了怎么办 军训中被教官训怎么办 命根子根部长豆豆很痒怎么办? 屁股坏了化脓了怎么办 貔貅屁股摔坏了怎么办 当兵身高差4厘米怎么办 查体戴眼镜视力达不到怎么办 公司福利体检查乙肝怎么办 有乙肝每年福利体检怎么办 国企有乙肝每年福利体检怎么办 单位福利体检查乙肝怎么办