2023年9月电子学会青少年软件编程C++四级题解

前言

两题动态规划,两题dfs+记忆化搜索,相较于五月份的考级难度有所降低。

第一题为动态规划,枚举第iii天的所有状态,然后递推找最大值即可

第二题是最简单的,选与不选两种状态递推到最后一个即可

第三题记忆化dfs,处理连续的地雷,注意边界即可

第四题同样是记忆化dfs,不过每种状态有点多,需要循环枚举状态。


酒鬼

Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴的是,瓶子中的酒都有不同的味道。房东说道:“你可以喝尽可能多的酒,但是一旦打开酒盖你就必须把它喝完,喝完一瓶后把它放回原处。还有一件最重要的事,你必须从左至右依次喝,并且不能连续超过三瓶,不然会给你带来坏运气。”现在可怜的Santo站在酒吧前努力的想着,他到底应该喝哪几瓶才能使喝的酒最多呢?请帮助他找出他应该喝的酒瓶号,因为思考让他感到不安。

时间限制:2000

内存限制:131072

输入

第一行一个整数NNN,有NNN个酒瓶。N<=700N<=700N<=700接下有NNN行,第i+1i+1i+1行的数字代表酒瓶iii中酒的体积。

输出

一个数字,喝的酒的最大总体积。遵守以上规则,使得三个连续瓶子中至少一个瓶子是满的。

样例输入

6
6
10
13
9
8
1

样例输出

33
解析

动态规划,定义f[i][j]f[i][j]f[i][j]为截至第iii天为止,连续喝jjj瓶酒的最大值,j=0,1,2j=0,1,2j=0,1,2三种情况

第一种 j=0j=0j=0,那么前一天的jjj可以为0,1,20, 1, 20,1,2,取最大值即可f[i][0]=max(max(f[i−1][0],f[i−1][1]),f[i−1][2])f[i][0] = max(max(f[i - 1][0], f[i - 1][1]), f[i - 1][2])f[i][0]=max(max(f[i1][0],f[i1][1]),f[i1][2])

第二种 j=1j = 1j=1,那么前一天不能喝酒 f[i][1]=f[i−1][0]+a[i]f[i][1] = f[i - 1][0] + a[i]f[i][1]=f[i1][0]+a[i]

第三种 j=2j = 2j=2,那么前一天结束必须喝一瓶 f[i][2]=f[i−1][1]+a[i]f[i][2] = f[i - 1][1] + a[i]f[i][2]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值