博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1880 石子合并
阅读量:6923 次
发布时间:2019-06-27

本文共 932 字,大约阅读时间需要 3 分钟。

 

题目描述

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

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
44 5 9 4
输出样例#1:
4354

解题思路

  由于是环形的,所以我们把石子复制一遍,比如5堆石子,从第4堆环形合并到第3堆(4、5、1、2、3),复制后石子编号就是4 5 6 7 8了,复制一遍就能拆环,直接当做两倍长的链处理。

  在这条链上,用动规数组f[j][i](代码风格太迷,一不小心反了)表示第i堆到第j堆所得积分的极值,它等于i到j的石子总数加已得积分的极值。比如要求2~5的积分,我们可以通过这么几种方式合并出2~5—— 2+3~5 2~3+4~5 2~4+5。求出这几种方式哪种能得到最多或最少的积分,一路求下去直到全部合成一堆为止。

源代码

#include
#include
int a[210]={
0};int f[210][210]={
0};int s[210]={
0};int n,ans;inline int max(int a,int b){ return a>b?a:b;}inline int min(int a,int b){ return a

 Ps:

  这题半年前就想写了,但由于码力不足,一直没动,今晚总算把它a了。

  现在时间:2017年06月03日02:26:43。凌晨做题真有意思,总是想睡觉又想切了这题再睡。

  由于状态转移掌握不太熟,一个状态从哪些情况转移过来(代码里的第三重循环),脑子不清楚,于是那段我是"调参"调出来的,我这种写法细节要注意的太多了……网上其他题解的状态转移写的真心简洁,循环方式也不同,代码量就少了很多,以后还要多多学习呀

转载地址:http://qjujl.baihongyu.com/

你可能感兴趣的文章
OpenGL ES 入门之旅 -- GLSL初识着色器语言
查看>>
实验四
查看>>
35. 搜索插入位置
查看>>
ab压测札记(Apache Bench)
查看>>
Mybatis怎么能看是否执行了sql语句
查看>>
GC算法 垃圾收集器
查看>>
21.自定义服务
查看>>
Android SAX、DOM、Pull解析xml文件剖析与案例讲解
查看>>
1138: 零起点学算法45——求最大值
查看>>
bzoj1711[USACO07OPEN]吃饭Dining
查看>>
查找 oracle 数据库中包含某一字段的所有表的表名
查看>>
python+selenium之测试报告自动化测试实例
查看>>
根据select中选定option触发不同事件
查看>>
大数据系统介绍
查看>>
《大话设计模式》读书笔记-第6章 装饰模式
查看>>
java的日期时间处理(待更新)
查看>>
语音处理
查看>>
Sonar
查看>>
django之分页器
查看>>
第二阶段冲刺4
查看>>