题目描述

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

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

4
4 5 9 4

输出样例#1:

43
54

思路:

用 dp_min[i][j] 来表示合并第 i 堆到第 j 堆石子的最小代价,用 dp_max[i][j] 来表示合并第 i 堆到第 j 堆石子的最大代价。

那么状态转移方程为:

dp_min[j][i] = min(dp_min[j][i],dp_min[j][k]+dp_min[(j+k+1)%n][i-k-1]+judge(j,i));
dp_max[j][i] = max(dp_max[j][i],dp_max[j][k]+dp_max[(j+k+1)%n][i-k-1]+judge(j,i));

其中 judge(j,i) 表示把两部分合并起来的代价,用 sum[i] 表示从第 1 堆到第 i 堆的石子个数和

源代码

#include <iostream>
using namespace std;int max(int x,int y)//求最大值
{if(x>y)return x;elsereturn y;
}
int min(int x,int y)//求最小值
{if(x>y)return y;elsereturn x;
}int n,sum[300];
int judge(int i,int j)
{  if(i+j>=n)//若大于堆数return judge(i,n-i-1)+judge(0,(i+j)%n);//进行循环判断else//若小于堆数return sum[i+j]-(i>0?sum[i-1]:0);//判断进行合并的值
}int main()
{int stone[300];int dp_min[300][300]={0},dp_max[300][300]={0};  int i,j,k;int min_score,max_score;cin>>n;//输入石头堆数for(i=0;i<n;i++) cin>>stone[i];//输入每堆个数sum[0]=stone[0];//第一堆个数for(i=1;i<n;i++)  sum[i]=sum[i-1]+stone[i];//计算当前堆数及其前面所有堆数的和for(i=1;i<n;i++)//合并n-1次{for(j=0;j<n;j++)//判断每堆是否合并{dp_min[j][i]=999999;dp_max[j][i]=0;for(k=0;k<i;k++)//依次判断到当前合并次数{  dp_min[j][i] = min(dp_min[j][i],dp_min[j][k]+dp_min[(j+k+1)%n][i-k-1]+judge(j,i));//最小值dp_max[j][i] = max(dp_max[j][i],dp_max[j][k]+dp_max[(j+k+1)%n][i-k-1]+judge(j,i));//最大值}}}for(i=0;i<n;i++){  min_score=min(min_score,dp_min[i][n-1]);//寻找最小值max_score=max(max_score,dp_max[i][n-1]);//寻找最大值}cout<<min_score<<endl;//最小值cout<<max_score<<endl;//最大值return 0;
}

石子合并(洛谷-P1880)相关推荐

  1. 洛谷P1880 [NOI1995]石子合并

    放题解 题目传送门 放代码 转载于:https://www.cnblogs.com/liuyuxinblog/p/10799085.html

  2. P1880 [NOI1995] 石子合并 的详解

    P1880 [NOI1995] 石子合并 [题目网站] [NOI1995] 石子合并 - 洛谷 [题目考点] 区间动态规划 [题目思路] 输入数组,把长度翻倍 初始化最小值数组 一个一个区间地填 找出 ...

  3. 洛谷P1775 石子合并(弱化版)

    原题传送门 题目描述 设有 N(N≤300)N(N \le 300)N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N1,2,3,\cdots,N1,2,3,⋯,N.每堆石子有一定的质量 m ...

  4. 洛谷 P1775 合并石子(弱化版)

    文章目录 合并石子(弱化版) 一.题目描述 二.思路 三.代码 合并石子(弱化版) 一.题目描述 https://www.luogu.com.cn/problem/P1775 设有 N(N \le 3 ...

  5. 区间DP初探 P1880 [NOI1995]石子合并

    https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...

  6. P1880 [NOI1995]石子合并

    蒟蒻做NOI系列的题,好慌...... 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...

  7. 【金牌导航】【洛谷 P3201】【启发式合并】梦幻布丁

    [金牌导航][洛谷 P3201][启发式合并]梦幻布丁 题目 解题思路 启发式合并真的就是想到挺难的,想到后简单得很 如何判断有几段还是很容易的,如果和前一个布丁颜色不同,段数+1 将每一种颜色看作一 ...

  8. 洛谷刷题C语言:Olivander、取石子、Davor、标题统计、成绩

    记录洛谷刷题QAQ 一.[COCI2017-2018#5] Olivander 题面翻译 题意简述 有 n n n 个棍子和 n n n 个盒子,要求每个盒子里放的棍子的总长度不能超过盒子的高度.求是 ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. Visual Studio UML Activity Diagram(2)
  2. 极客新闻——09、如何打造核心骨干团队
  3. 高级打字机【主席树】【滚动数组】【块状链表】
  4. DOxygen for C++使用说明——添加数学公式
  5. vscode安装live server
  6. 53. 最大子数组和(JavaScript)
  7. Retrofit工作原理总结
  8. C# SOCKE通信
  9. javascript 实现简单计算器
  10. 搭建离线 Nexus3 仓库
  11. android 悬浮窗口透明,基于popupWindow实现悬浮半透明效果
  12. TSC打印机,使用java打印二维码
  13. 论文翻译:2021_Performance optimizations on deep noise suppression models
  14. php chm中文手册201502月更新
  15. 【播放器】媒体播放器三大架构
  16. 用c语言实现窗口化,c怎么窗口化只能开挂吗
  17. pdf合并、生成目录大纲
  18. Android仿微信语音聊天
  19. python前端学习之js
  20. 微信小程序应用开发赛作品综合开发记录——晋鹿文旅(云开发——概览)

热门文章

  1. STM32之SysTick原理
  2. S5PV210裸机之SD卡
  3. 简历准备及面试技巧,你应该知道的一切
  4. CPU可以跑多快?地球到火星的距离告诉你!
  5. 「面试」美团肝了我30+问题
  6. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!
  7. 这是什么神仙剧情?全网黑客,都在帮一个脑瘫女孩破解软件!
  8. 2019 Java发展趋势报告:Java老矣,Java正年轻
  9. 2019届互联网校招本科薪酬清单
  10. Maven实战---两个war包的调用