入门OJ 1203: 酒鬼
Posted forth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门OJ 1203: 酒鬼相关的知识,希望对你有一定的参考价值。
题目
Description
Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴的是,瓶子中的酒都有不同的味道。房东说道:“你可以喝尽可能多的酒,但是一旦打开酒盖你就必须把它喝完,喝完一瓶后把它放回原处。还有一件最重要的事,你必须从左至有依次喝,并且不能连续超过三瓶,不然会给你带来坏运气。”现在可怜的Santo站在酒吧前努力的想着,他到底应该喝哪几瓶才能使喝的酒最多呢?请帮助他找出他应该喝的酒瓶号,因为思考让他感到不安。
Input
第一行一个整数(N),有(N)个酒瓶。(Nleq700)接下有N行,第(I+1)行的数字代表酒瓶(I)中酒的体积。
Output
一个数字,喝的酒的最大总体积。遵守以上规则,使得三个连续瓶子中至少一个瓶子是满的。
Sample Input
6
6
10
13
9
8
1
Sample Output
33
题解
DP从头开始学系列
(dp_i)表示前(i)瓶能喝的最大体积, 转移方程为
[ dp_i = max(dp_{i - 1}, dp_{i - 2} + wine_i, dp_{i - 3} + wine_i + wine_{i - 1}) ]
#include <cstdio>
#include <algorithm>
int dp[710];
int n, wine[710];
int main(int argc, char const *argv[]) {
scanf("%d", &n);
for (register int i(1); i <= n; ++i) {
scanf("%d", &wine[i]);
}
dp[1] = wine[1], dp[2] = wine[1] + wine[2];
for (register int i(3); i <= n; ++i) {
dp[i] = std::max(dp[i - 1], std::max(dp[i - 2] + wine[i], dp[i - 3] + wine[i] + wine[i - 1]));
}
printf("%d
", dp[n]);
return 0;
}
以上是关于入门OJ 1203: 酒鬼的主要内容,如果未能解决你的问题,请参考以下文章
二分图匹配入门专题1I - Hiding Gold light oj 1152二分图匹配-------------------我是终于不那么水的水题分割线------------------(代码片