输入描述:
输入包括两行: 第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块 第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000)
输出描述:
如果小易能堆砌出两座高度相同的塔,输出最高能拼凑的高度,如果不能则输出-1. 保证答案不大于500000。
输入例子:
3 2 3 5
输出例子:
5
小易现在让能够堆砌出来的两座塔的高度尽量高,说明是求最优值。适合用DP,一块砖只能用一次就是01背包问题了。
接下来就是想怎么构造最优子结构 dp[i][j]
i肯定是前i个砖块,问题是怎么求当两堆砖块高度相等时,最高的情况。因为高度不等的两堆砖块加上一个砖块之后可能会相等,所以需要记录不相等的详细信息,那么j就是两堆砖块的高度差。在高度差为0的时候,就是两堆砖块高度相等的时候,那么此时两堆砖块任何一堆的高度就是我们相求的值。所以i表示前i个砖块,j表示两堆砖块的高度差,dp[i][j]表示其中一堆的高度
我们设两堆砖块分别为A堆,B堆。j=B堆高度-A堆高度。 dp[i][j]为B堆的高度。 (当然你也可以有其他的设置方法,只要符合红字就可以。)因为题目要求不能堆砌出相同高度时要输出-1,所以对于不可能的情况我们要将值设为-1表示,我们一开始假设所有的情况都不可能(除了dp[0][0] = 0,在0个砖块情况下,两堆砖块高度差为0,且B堆砖块高度为0,这是成立的)。
对于前i个砖块,要想求两堆高度差(B-A)为j时,B堆砖块高度的最大值。有以下几种情况,第一种,可能不使用第i个砖块,当前i-1个砖块,在两堆高度差为j时,B堆砖块高度已经是最大值,此时dp[i][j] = dp[i-1][j]。第二种,需要使用第i个砖块,且需要你把第i个砖块放到A堆时,此时高度差变为j,B堆砖块高度为最大值。设第i个砖块的高度为h[i],那么在前i-1个砖块的时候,高度差为j+h[i] (因为这里我们的高度差是B-A,你把砖块加到A堆时缩小了高度差)<