入门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;
}
原文地址:https://www.cnblogs.com/forth/p/9772623.html