1.合并石子

《信息学奥赛一本通》第五版 P371 第三节 T1

我就直接开始讲吧:

Warning:这个题目和 合并果子 不一样!不一样!不一样!不一样!不一样!不一样!不一样!不一样!

:我想告诉你一个事情,你帮帮我好么?

(内心:mmp怎么又是这个人)

:昨天我去商场的时候,钱包被偷了,银行卡啥的都没了,你能帮帮我么?

(内心:凭啥,我就不帮)

:如果你帮我找到的话,我给你50金币好不好?

(*听到这句话,你充满了决心)

好吧,那我们帮帮他吧,让我们先看看他遇到了什么问题

:那个小偷在我的钱包里留了一张纸条,上面写着一个地址,我昨天到那里去之后看到那儿有几堆石头,上面都有数字,旁边有一块石碑,要我把相邻的两对合并,最后只剩一堆,让花费的体力最小

体力是怎么计算的呢?

:两堆石子合并之后,花费的体力值为两堆石头上的数字的和

好,那我们先和他告别,自己想一想

他已经告诉我们,有 N 堆石子,每堆石子都有对应的一个数字

我们就开一个 stone 数组表示吧

不过要说明一点,为了表示方便,我们把 stone[i] 表示为前 i 堆石子的和

我们再开一个 giver 二维数组,并且让 giver[i][j] 表示为第 i 堆到第 j 堆的石子合并之后花费的最小体力值

那么,我们应该怎么去求得花费最小的体力值呢?

让我们仔细思索一下

先开个循环吧

设有一 i 并使得 i=n-1...1 作为左端点

再设一 j 使得 j=i+1...n 作为右端点

可是这样好像还不够

那我们再弄一个 k 并让 k=i...j-1 把 i 开头 j 结尾的 giver[i][j] 分成两段

k 枚举每一种可能的分段,一步一步推出正确答案!

根据上面的东西,我们就可以推出状态转移方程:

giver[i][j]=min(giver[i][j],giver[i][k]+giver[k+1][j]+stone[j]-stone[i-1]);

对啦!

边界条件:

giver[1...n][1...n]=0;

现在,让我们带着这两个小朋友开始破译这个问题吧!

代码如下:

 1 #include <bits/stdc++.h>
 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
 4 using namespace std;
 5 inline int botposs(int a,int b,int pd){
 6     if(pd==1) return a>b?a:b;
 7     if(pd==0) return a>b?b:a;
 8 }
 9 int main(){
10     int n;
11     int stone[100+20]={0};
12     int giver[100+20][100+20];
13     memset(giver,32,sizeof(giver));
14     stone[0]=0;
15     scanf("%d",&n);
16     fp(i,1,n){
17         int x;
18         scanf("%d",&x);
19         stone[i]=stone[i-1]+x;
20     }
21     fp(i,1,n){
22         giver[i][i]=0;
23     }
24     fd(i,n-1,1){
25         fp(j,i+1,n){
26             fp(k,i,j-1){
27                 giver[i][j]=botposs(giver[i][j],giver[i][k]+giver[k+1][j]+stone[j]-stone[i-1],0);
28             }
29         }
30     }
31     printf("%d",giver[1][n]);
32     return 0;
33 }

合并石子

现在我们去找他吧!

他成功了吗?

:成是成功了,钱包也找回来了,可是解开这个谜题之后,突然出现了一个山洞,里面有一个房间,乌七八黑的,我不敢进去,你再帮帮我好吗?如果成功,我给你100金币

(*你充满了决心)

好吧,我们就再答应他一次吧!为了我们的金币!


2.乘积最大

《信息学奥赛一本通》第五版 P371 第三节 T2

:你好啊,昨天我感冒了,对,就是那种,最新的,恩恩,对对对

这个家伙怎么了?这才一个晚上呢,怎么就感冒了?

:哦,可能是昨天空调开太大了,然后踢了被子,就着凉了吧

...

:对了,我们去山洞那儿吧

我们走吧

:咦,怎么到处都是警……阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿阿嚏

看样子他咳得很严重啊,不过我们还是得先想办法进去,这儿全都是警察...

那我们作弊吧,花费20金币进去( - MDZZ还能这么玩? - 我有钱我是RMB玩家你咬我啊略略略略略)

好的,现在我们进来了,现在我们眼前有一张书桌,上面趴着一个人,手里有一支带有血迹的笔,桌子上到处都是凝固了的血液

:(loudly)哇,好可怕好血腥啊............

拜托啊你少说点话啊,被警察发现就完蛋了啊!

(very loudly)啊?什么?

......那我们先捂住他的嘴,等警察走了之后,自己去看看

越过封锁线,我们来到书桌前,观察一下吧,加点Exp

咦?这支笔怎么像脱节了一样啊?

让我们拆开,里面有一张卷曲的纸片,上面写着几行字

我们了解一下大意啊,恩,应该就是说:

给你k个乘号,让你插入一个数,使得插入之后的各个数乘积最大,保证乘号的数量比数字的位数少起码两个

恩........................................................................................................................................

我想这道题应该可以用动态规划来完成

我们将$k$个乘号视为$k$个阶段

我们先设一$num$数组并且用$num[j][i]$表示第$j$位到第$i$位的所组成的自然数

按照套路,我们搞一个$dp$数组并且得到状态转移方程$dp[i][j]=max{dp[j][k-1]*num[j+1][i]}(k<=j<i)$

不过,代码实现时的方程应该是这样的$dp[i][k]=max(dp[i][k],dp[j][k-1]*num[j+1][i])$

加上一个边界条件$dp[j][0]=num[1][j](1<=j<=n)$

最后的代码就不放出来啦!

:唔......

啊,我们忘记他了!

他指不准又弄出了什么幺蛾子,反正100金币已经到手了,去看看吧!


转载于:https://www.cnblogs.com/Fraction/p/8413340.html

蒟蒻吃药计划-治疗系列 #round 2 合并石子+乘积最大相关推荐

  1. 蒟蒻吃药计划-治疗系列 #round6 数据结构初步-指针|链表|结构体

    今天小蒟蒻我学习了一丁点儿关于数据结构的东西,现在我来和大家昏响昏响. %%%WEY神犇神速切火题 更新中 转载于:https://www.cnblogs.com/Fraction/p/8477739 ...

  2. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  3. NOIP 2015 蒟蒻做题记录

    昨天做了noip 2015 的题.因为之前做过几道,最开始做的很快,也都A了.可是子串斗地主运输计划什么的这些没做过的题还是把我恶心的不行QAQ我这个大蒟蒻还是没有A掉..所以说先写一下应该得到的暴力 ...

  4. 蒟蒻的C盘怎么又变红了?(C盘空间快满了怎么清理,AppData,winsxs,Local,Roaming等文件夹如何清理,哪些文件可以删除,哪些属于垃圾)

    关注作者:JuruoAssociation 原创于 CSDN 原创不易,谢绝转载!不曾授权任何转载!建立在抄袭上的流量不会持久.你选择的光,将驱散你身边的黑暗,也将给我们伟大祖国版权事业的未来添一把炬 ...

  5. 蒟蒻的python 学习笔记 ——北京理工大学嵩天mooc(有时间就看就更新,尽量让笔记容易懂,蟹蟹各位大神不吝赐教)

    蒟蒻的python 学习笔记 前言 课一:python语言程序设计 第一周:python 基本语法元素 1.1 程序设计基本方法 1.2 python 环境配置 1.3 实例1:温度转换 1.4 py ...

  6. 本蒟蒻对于二分图一些定理的理解

    本蒟蒻对于二分图一些定理的理解 先给出一些定理 (常识) 1.对于一个无向图 G,若 G 中的所有回路长度均为偶数,则G为一个二分图. 2.二分图的最小点覆盖 = 最大匹配数. 3.二分图的最大独立集 ...

  7. 【bzoj4916】神犇和蒟蒻 杜教筛

    题目描述 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出 请你输出一个整数A=\sum_{ ...

  8. 蒟蒻浅谈树链剖分之一——两个dfs操作

    树链剖分,顾名思义就是将树形的结构剖分成链,我们以此便于在链上操作 首先我们需要明白在树链剖分中的一些概念 重儿子:某节点所有儿子中子树最多的儿子 重链:有重儿子构成的链 dfs序:按重儿子优先遍历时 ...

  9. python字符串去头尾_悉尼大学某蒟蒻的Python学习笔记

    About me 本蒟蒻是悉尼大学计算机科学大一的学生,这篇博客记录了学习INFO1110这门课的一些心得,希望能对大家有帮助. To start with 因为计算机只能识别机器语言,所以我们需要编 ...

最新文章

  1. rax+react hook 实现分页效果
  2. 12个超炫数据可视化工具_Python5个数据可视化工具
  3. Ubuntu 首次给root用户设置密码
  4. python多任务编程_python线程的多任务编程
  5. LDAP----manage-account
  6. 人人都是产品经理1.0
  7. OpenGL环境配置(超全整合版)
  8. vim编辑器的基本使用
  9. Android ListView下拉刷新点击加载更多
  10. Xcode12 兼容iOS14 及下载链接
  11. ai人工智能电子计算机星际穿越,以智慧AI为眸,华为nova5系列带你来一场“星际穿越”...
  12. 非法集资(Illegal Fund-raising)
  13. 汽车发展史大事件(1766-2017)
  14. win10显示未插入扬声器或耳机的解决方案
  15. Hibernate - HQL对象检索详解
  16. CF 1056D Decorate Apple Tree
  17. Android中action启动方法大全
  18. LED灯光照明控制协议(系统)- DALI
  19. python客户端软件开发_妙小程python客户端
  20. spring cloudAlibaba gateway网关报错,显示无法找到注册中心注册自己。

热门文章

  1. 2022-2028年中国交通建设PPP模式深度分析及发展战略研究报告(全卷)
  2. 人要懂得放下已经发生,却又无法改变的事情
  3. 【牛腩新闻发布系统】整和后台05
  4. 【运维学习笔记】生命不息,搞事开始。。。
  5. Win10家庭版如何启用本地组策略
  6. pytorch 动态调整学习率 重点
  7. MLIR与Code Generation
  8. TVM自定义数据类型
  9. 降低数值精度以提高深度学习性能
  10. HDR sensor 原理介绍