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
  • 相关阅读:
    文摘
    Maximal Square leetcode
    Majority Element II
    Merge k Sorted Lists leetcode
    学习方法-暗时间
    4sum leetcode
    valid parentheses
    两道考研算法设计题- 2010 2013
    regular expression matching DP
    valid sudoku leetcode
  • 原文地址:https://www.cnblogs.com/terencezhou/p/2664921.html
Copyright © 2011-2022 走看看