小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。
思路:动态规划
dp[i][j]表示用前i个砖块堆成两块(A,B),它们的高度差为j时的高度(A,B其中的较小值,如下图)
dp[n][0]即为题目的解。
d[i]: 第i块砖的高度
状态转移:
dp[i][j]= dp[i-1][j] //当放弃第i块砖时
dp[i][j]= dp[i-1][j-d[i]] //当将第i块砖放入高的那一边时
当将第i块砖放入矮的那一边时,可能会超过原本高的高度
dp[i][j]= d[i]+ dp[i-1][j+d[i]]
dp[i][j]= dp[i-1][d[i]-j]+ d[i]-j;