zoukankan      html  css  js  c++  java
  • 入门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;
    }
    
  • 相关阅读:
    源码解析.Net中IConfiguration配置的实现
    python小工具
    hue搭建以及报错记录
    jenkins启动指定数据目录
    基于三维地图的智慧园区可视化解决方案
    工业4.0的下一个十年
    项目管理知识体系介绍
    人工智能发展的新方向
    速成财务产品经理
    标准化体系:运营—训练—督导
  • 原文地址:https://www.cnblogs.com/forth/p/9772623.html
Copyright © 2011-2022 走看看