点击打开链接

思路: 区间dp
分析:
1 很多人可能看到这一题首先想到的是贪心,但是很不幸的是这道题的贪心做法是错误的,因此正解是dp
2 不管怎么合并,总之最后总会归结为2堆,如果我们把最后的两堆分开,左边和右边无论怎么合并都必须满足最优合并方案,整个问题才能是最优的
3 题目是一个环,我们可以把环变成链那就是在后面在加上去,那么最后的ans一定是dp[1][n-1],dp[2][n]...中的最小值和最大值
4 我们dpMin[i][j]表示合并第i堆到第j堆石子所得的最小分数,dpMax[i][j]表示最大分数。sum[i]表示从1~i堆石子的分数总和
5 很容易得到状态转移方程
dpMin[i][j] = min(dp[i][j] , dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
dpMax[i][j] = max(dp[i][j] , dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;const int INF = 1<<30;
const int N = 210;
int n;
int num[N] , sum[N];
int dpMax[N][N] , dpMin[N][N];void init(){memset(sum , 0 , sizeof(sum));for(int i = 1 ; i <= 2*n ; i++){dpMax[i][i] = dpMin[i][i] = 0;sum[i] = sum[i-1]+num[i];;}
}void solve(){for(int k = 1 ; k < n ; k++){//枚举区间的长度for(int i = 1 ; i <= 2*n-k ; i++){//区间的左端点int j = i+k;//区间的右端点dpMax[i][j] = -INF;dpMin[i][j] = INF;//枚举区间的剖分点for(int p = i ; p < j ; p++){int score = sum[j]-sum[i-1];dpMax[i][j] = max(dpMax[i][j],dpMax[i][p]+dpMax[p+1][j]+score);dpMin[i][j] = min(dpMin[i][j],dpMin[i][p]+dpMin[p+1][j]+score);}}}int minSco = INF;int maxSco = -INF;for(int i = 1 ; i <= n ; i++){minSco = min(minSco , dpMin[i][i+n-1]); //注意区间长度为n那么右端点是i+n-1maxSco = max(maxSco , dpMax[i][i+n-1]); }printf("%d\n%d\n" , minSco , maxSco);
}int main(){while(scanf("%d" , &n) != EOF){for(int i = 1 ; i <= n ; i++){scanf("%d" , &num[i]); num[i+n] = num[i];}init();solve();}return 0;
}

RQNOJ 石子合并相关推荐

  1. 石子合并[DP-N3]

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

  2. CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并

    题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...

  3. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp

    文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...

  4. 51nod 1022 石子合并v2

    就是石子合并的数据范围变为了1e3 经典四边形优化区间dp const int N = 2e3 + 10; const long long inf = 1e18; long long dp[N][N] ...

  5. NYOJ737 石子合并(一)区间动态规划

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成 ...

  6. 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)

    3229: [Sdoi2008]石子合并 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合 ...

  7. SDNU 1048.石子合并2(区间dp)

    Description 有n堆石子排成一圈,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

  8. SDNU 1045.石子合并1(区间dp)

    Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

  9. 石子合并(GarsiaWachs算法)

    对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法.时间复杂度为O(n^2). 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] <= ston ...

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

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

最新文章

  1. 【反传销】春节一个短暂误入传销和脱身的真实故事以及对技术的思考
  2. Selenium2+python自动化58-读取Excel数据(xlrd)
  3. mysql数据库query cache
  4. STL 容器和迭代器连载8_访问顺序容器的元素
  5. SpringCloud--Eureka 注册中心原理及其搭建
  6. 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
  7. JavaScript设计模式-观察者模式
  8. 初中毕业也能月薪过万!5个质量极高的教程网站,免费献给你
  9. 等保测评机构推荐证书撤销,纳入国家认证体系
  10. iPhone15将开放15W无线快充!
  11. 163vip.com登陆TOM邮箱,定位商务人士的专属邮箱!
  12. 一点Scala学习资源
  13. Profinet高速协议下,PLC之间如何实现无线以太网通讯?
  14. Java之图片裁剪工具类-yellowcong
  15. Java生成动态GIF图片
  16. 算力寻租或将终结中本聪的POW机制?深度解析BCH“司机补贴战”
  17. 谷粒商城-03-p28-p44
  18. 复选框弹出确认框,点取消,仍会打钩或者把钩消掉
  19. c#创建画布_c# GDI+简单绘图(四) 简易画板功能
  20. (一)Xray-的安装,入门的使用方法

热门文章

  1. 计算机科学与技术导论 网站,计算机科学与技术导论
  2. 神经网络的BP算法推导详解
  3. H3C交换机SSH配置完全攻略
  4. python里的url是什么意思_URI和URL的简介
  5. 【OpenCV学习】物体跟踪的粒子滤波算法
  6. robot framework接口自动化测试post请求
  7. Mars-Android开发视频教程(全集)
  8. LCD的控制驱动及基与MCU接口的特点
  9. 杭州有哪些牛批的互联网公司
  10. 北大学霸不当外交官,回国种地养猪终于熬出年销2000万