[计算机]《糊涂情报员》解题报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机]《糊涂情报员》解题报告

第一轮省选解题报告 By sx349 【摘要】 核心算法思想:动态规划 主要数据结构: 其他辅助知识:数论 时间复杂度:(N为式子中的数的个数) 空间复杂度: 【题目大意】 给定一个式子,给这个式子增加括号,使这个式子的值最大。 【算法分析】 根据给定的式子添加括号的过程,实质上是改变式子中每一个运算符的先后运算顺序。显然,式子运算的最后一步必然是选择该式子中的某个运算符,并且将运算符前后的式子的值进行运算。而我们的目的就是求得最后整个式子的最大值。 考虑将整个式子中的每一个数即为一个节点,显然,我们可以直接得到一个朴素的算法:枚举每一步的操作,得到最终结果。显然,其时间复杂度将达到,这显然是不能接受的。但是我们由此考虑开去,经过这每一步的操作,我们其实建立了一棵运算树,树的每一个叶子结点是一个数字,每个非叶子节点是一个运算符,且必然连接左右两个子节点,而这棵树的后序遍历就是我们最初的式子。 显然,假设我们建立了树的一部分,那么树的其他部分对这一部分的值是没有任何影响的,这样,我们可以考虑分部分解决这个问题。根据这个思路,可以得到如下的一个算法。 我们先考虑从第I个数字开始,第J个数字结束的一段式子的最大值,显然,我们可以得到如下的状态转移方程: 其中,函数计算的是从i到j并在k处中断时得到的最大值。 考虑在k处运算符不同的情况下的求法: ①若运算符为‘+’,则 ②若运算符为‘-’,则 ③若运算符为‘*’,则 其中用到了另一个状态,表示从第I个数字开始,第J个数字结束的一段式子的最小值。 考虑最小值的原因主要是中间过程可能有负数出现,可能某一步中的最大值是由两个最小的负数相乘得到的,或者是由运算符左侧得数的最大值减去运算符右侧得数的最小值得到的。因此如果不考虑最小值,就会导致最大值出现偏差。 因此,我们还要考虑的值: 并且考虑的求法: ①若运算符为‘+’,则 ②若运算符为‘-’,则 ③若运算符为‘*’,则 计算出和中的值后,输出(n为数字总数)。 显然,在计算时我们需要先计算的情况,然后是,依次递增。这样,访问的时候基本上是跳跃式的。因此,我们把表示为从第I个数字开始,数字长度为J的一段式子的最大值,这样在计算时,就可以在访问时连续访问相近的格子,减少了跳跃式访问造成的寻址时间。 【心得体会】 这次省选的题目当中也许这是最简单的一道,但这道题也相对比较考察选手的细心程度。题目的样例选择了一个会有最小数影响结果的式子,我在一开始考虑时也并没有考虑一段式子的最小值,在带入样例时才发现了这一点。诚然,也许这样做是出题者有所考虑的缘故,但是,如果当初恰好选择了一个不受最小值影响的样例,相信像我一样的选手会有很多就因此栽跟头。因此,回顾本题,我更多地看到了自己在细节方面还是欠考虑的。尽管不能将方方面面全部考虑周全,但是在以后的学习中,绝对是需要督促自己考虑的更加周密的。 【附录】 糊涂情报员 【问题描述】 有一位间谍,根据他所在情报机构提供的编码方式,将他收集到的情报编成数字码保存,以便有机会时带回国。但他认为这样还不够安全,所以他再将这些数字串随意切割成若干个数字,然后将每个整数用一个数学算式来表示。这些算式只用了加、减、乘三个运算符,且每个运算数均为正整数。最后,他为了让自己更为心安,将整个密码分成两本密码本储存。密码本 A 存放这些数学算式,但他将算式中的所有括号全部拿掉,然后再将这些拿掉的括号资料记录在密码本 B 里。 过了不久他有机会回国述职,却不幸遇到车祸头脑受到了损伤,同时密码本 B 也丢掉了。由于头脑受到损伤,他对很多情报的内容已记不太清楚,再加上没有了密码本 B 他几乎是束手无策。在此情况下,该国的情报机关只好动用几位心理专家对他进行记忆唤醒。然而,这些专家在经过各种努力后均无功而返 , 唯一在对他进行深度催眠时发现:这位情报员在写密码算式时,倾向于将括号加在那些会让算式得到最大值的位置。例如: 5*7+2 这个算式,有两种加括号的方法:((5*7)+2)及 (5*(7+2)), 显然第二种方法所得到的值较大。 果然,经使用此种方法,即算出算式的可能最大值,可将密码破解。现在请你将密码本 A 存放的数学算式算出可能的最大值。 【输入】 每一数学算式为一行,只用加、减、乘三个运算符 , 每一个运算数都是一个正整数( ≤100 ) , 运算符与运算数之间不会有空白。同时,一行运算式不会超过 50 个运算符。 【输出】 相对于每一个输入的算式,输出运算结果的最大值。该值都会是一个正整数,且不超过 2147483647. 【样例】 输入: 6*3-9*3 输出: 27 输入: 5+2-7*2-3 输出: 14 【源代码清单】 { PROG: ProvinceOI2009 LANG: PASCAL ID: xyj-

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档