public int tallestBillboard(int[] rods) {
int n = rods.length;
int sum = 0;
for (int rod : rods) {
sum += rod;
}
int[][] dp = new int[n + 1][sum + 1];//dp[i][j] 表示使用第rods[i-1]时,两个不重复的子数组相差为j时 两个子数组最大总和
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= sum; j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j]);
if (dp[i-1][j] < j) {//
continue;
}
int k = j + rods[i - 1];
dp[i][k] = Math.max(dp[i][k], dp[i - 1][j] + rods[i - 1]);//加在长的一端
k = Math.abs(j - rods[i - 1]);
dp[i][k] = Math.max(dp[i][k], dp[i - 1][j] + rods[i-1]);//加在短的一端
}
}
return dp[n][0]/2;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.