zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    WinForm被遮挡的控件解决方案
    IC卡资料
    水晶报表2008部署
    打造最强的VC6
    SqlServer Case
    using namespace std
    非接触式IC智能(射频)卡
    删除VS2005插件

    SQLServer2005数据库自动备份
  • 原文地址:https://www.cnblogs.com/reddest/p/6003058.html
Copyright © 2011-2022 走看看