zoukankan      html  css  js  c++  java
  • [动态规划] 能量苹果问题

    Maximum Energy
    Time Limit:1000MS  Memory Limit:32768K
     
    Description:
    Bob wanted to increase his energy by eating AC-APPLEs. There are N(1 <= N <= 150,000) AC-APPLEs, each AC-APPLE had a magic value "v" which is a positive interger and not bigger than 500. Bob visited AC-APPLEs which are given in order, every time he faced an AC-APPLE, he can choose "eat this one" or "pass this one". The odd time Bob ate, he increase v units energy. The even time Bob ate, he decrease v units energy. Before eating any AC-APPLE, Bob's enerny is 0. Please calculate the Maximum Energy Bob can increase by eating AC-APPLEs.
     
    Input:
    The input will consist of more than one data set. Each data set has two lines. First line has an interger N. Second line has N intergers which means the magic value of each AC-APPLEs.
     
    Output:
    the Maximum Energy Bob can increase
     
    Sample Input:
    8
    7 2 1 8 4 3 5 6
     
    Sample Output:
    17
     
     
    问题翻译:
    现有N(1<=N<=150,000)个苹果组成的序列,每个苹果有一个能量值v( 1<=v<=500)。鲍勃依次访问这些苹果,没次遇到一个苹果,鲍勃有两种选择,吃掉它或忽略它。当鲍勃第奇数次吃苹果时,他的能量增加v,当第偶数次吃苹果时,他的能量值减v。初始状态鲍勃的能量值为0,请计算鲍勃可能得到的最大能量值。
     
    输出:
    可能获得的最大能量值
     
    输入例子:
    8
    7 2 1 8 4 3 5 6

    输出例子:
    17
     


    首先分析问题解的性质。面对这一串苹果,鲍勃的选择很多,每遇到一个苹果,都可以选择“吃”或“不吃”。所有可能的情况有2N, 因此遍历所有的情况是不现实的。由于鲍勃的目的是获取最大能量,所以鲍勃吃的最后一个苹果,一定是增加能量,即第奇数次吃苹果。若鲍勃最后吃了偶数个苹果,则可以通过忽略最后吃的那个苹果,获得更大的能量状态,可以证明上述推断。
     
    再考虑整个问题是否能被分解为若干子问题。当鲍勃已经处理了N-1个苹果,遇到最后一个苹果时,可以“吃”或“不吃",这依赖于在处理完N-1个苹果后鲍勃的状态。鲍勃可能有两种状态,已经吃了奇数个苹果,已经吃了偶数个苹果。当已经吃了奇数个苹果,如果再选择“吃”,则会降低能量,因此在N-1阶段,若鲍勃的状态为奇数,则会选择“不吃”。同样的思路,可以证明若在N-1阶段鲍勃的状态为偶数,他会选择"吃"。
    定义f(Lx)为处理了苹果序列L的前x个苹果后,可以得到的最大能量。根据上述分析,f(Lx)依赖于三个值,处理完x-1个苹果且吃了偶数个苹果时的最大能量值,vx处理完x-1个苹果且吃了偶数个苹果时的最大能量值。根据一开始的分析,f(Lx-1)必定吃了奇数个苹果。再定义函数g(Lx)表示处理完x个苹果,且吃了偶数个时的最大能量值。至此,可以写出递归公式。g(Lx)的递归关系与f(Lx) 类似。
    f(Lx) = max{f(Lx-1), g(Lx-1) + vx}
    g(Lx) = max{g(Lx-1),  f(Lx-1) - vx}  
    f(L0)=0
    g(L0)=0
    可利用动态规划求解。
     
    以此输入为例。
    8
    7 2 1 8 4 3 5 6
      1 2 3 4 5 6 7 8
    vx 2 1 8 4 3 5 6
    f(Lx) 7 7 7 14 14 14 16 17
    g(Lx) 0 5 6 6 10 11 11 11
     
     
     
     
     
     
    可以得到解f(L8)=17
  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/terencezhou/p/2664921.html
Copyright © 2011-2022 走看看