【OpenJudge9268】【递推】酒鬼

酒鬼

总时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB

【描述】

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

【输入】

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

【输出】

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

【样例输入】

6
6
10
13
9
8
1

【样例输出】

33

【Solution】

  用dp[i]表示到第i瓶的最大值。每到一个i可以判断 是不喝第i瓶、还是只喝第i瓶、还是喝第i瓶和i-1瓶。所以dp[i]=max(dp[i-1],max(dp[i-2]+data[i],dp[i-3]+data[i]+data[i-1]))

 

  AC代码:

  

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int N;
 5 int data[710],dp[710];
 6 int main(){
 7     scanf("%d",&N); for(int i=1;i<=N;++i) scanf("%d",&data[i]);
 8     dp[1]=data[1]; dp[2]=data[1]+data[2];
 9     for(int i=3;i<=N;++i)
10         dp[i]=max(dp[i-1],max(dp[i-2]+data[i],dp[i-3]+data[i]+data[i-1]));
11     printf("%d",dp[N]);
12     return 0;
13 }

 

posted @ 2016-10-27 10:42  Reddest  阅读(466)  评论(0编辑  收藏  举报