【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 }