前言
两题动态规划,两题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[i−1][0],f[i−1][1]),f[i−1][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[i−1][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]

最低0.47元/天 解锁文章
1573

被折叠的 条评论
为什么被折叠?



