题意
goozy对积木十分的狂热,今天他想搭一个双子塔(就是两个高度一样的塔)!他想知道,用现有的积木,能不能实现这个想法.积木个数n(1 <= n <= 50),每个积木的高度hi(1 <= hi <= 500000),题目保证所有积木高度总和不超过500000。
分析
建立状态
这题和能不能把所有的平分是不一样的,因而我只要保证有一种方案把积木部分平分就好了
所以建立状态不能用dp[i][j]表示i木块j高度是否可达
状态是dp[i][j]表示前i个木块使得两份木块高度差为j的最大可达高度是多少.
状态转移
状态转移就很简单了,积木i放到比较高的那一方或者比较低的那一方
放到比较高的一方
dp[now][j+h] = max(dp[now][j+h],dp[1-now][j]+h);
放到比较低的一方
newh = max(dp[1-now][j]-j+h, dp[1-now][j]);
dp[now][abs(h-j)] = max(dp[now][abs(h-j)], newh);
思考
- 有时候dp建立状态后发现某一位范围过大,不能直接dp[i][j]的时候可以考虑特殊性质,然后对他们的差进行状态转移,正如D题一样
1 | /************************************************************************* |