[动态规划] 能量苹果问题
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 | 7 | 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