1049. 最后一块石头的重量 II

image.png
image.png

二维数组

  1. class Solution {
  2. public int lastStoneWeightII(int[] stones) {
  3. int size = stones.length;
  4. if(size == 1) return stones[0];
  5. int sum= 0, target = 0;
  6. for(int i : stones ) {
  7. sum += i;
  8. }
  9. target = sum / 2;
  10. int [][] dp = new int [size][target + 1];
  11. for(int j = target; j >= stones[0]; j-- ) {
  12. dp[0][j] = stones[0];
  13. }
  14. for(int i = 1; i < size; i++ ) {
  15. for(int j = 0; j <= target; j++ ) {
  16. if(j < stones[i]) {
  17. dp[i][j] = dp[i - 1][j];
  18. } else {
  19. dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i] ] + stones[i]);
  20. }
  21. }
  22. }
  23. return sum - 2 * dp[size - 1][target];
  24. }
  25. }

滚动数组

  1. class Solution {
  2. public int lastStoneWeightII(int[] stones) {
  3. int size = stones.length;
  4. if(size == 1) return stones[0];
  5. int sum = 0,target = 0;
  6. for(int i : stones ) {
  7. sum += i;
  8. }
  9. //向下取整(如 1 ,1/2 = 0)
  10. target = sum / 2;
  11. int dp[] = new int[sum + 1];
  12. for(int i = 0; i < size; i++ ) {
  13. for(int j = target; j >= stones[i]; j-- ) {
  14. dp[j] = Math.max(dp[j],dp[j - stones[i] ] + stones[i]);
  15. }
  16. }
  17. return sum - 2 * dp[target];
  18. }
  19. }