zoukankan      html  css  js  c++  java
  • Lintcode: Minimum Adjustment Cost

    1 Given an integer array, adjust each integers so that the difference of every adjcent integers are not greater than a given number target.
    2 
    3 If the array before adjustment is A, the array after adjustment is B, you should minimize the sum of |A[i]-B[i]| 
    4 
    5 Note
    6 You can assume each number in the array is a positive integer and not greater than 100
    7 
    8 Example
    9 Given [1,4,2,3] and target=1, one of the solutions is [2,3,2,3], the adjustment cost is 2 and it's minimal. Return 2.

    这道题要看出是背包问题,不容易,跟FB一面 paint house很像,比那个难一点

    定义res[i][j] 表示前 i个number with 最后一个number是j,这样的minimum adjusting cost

    如果第i-1个数是j, 那么第i-2个数只能在[lowerRange, UpperRange]之间,lowerRange=Math.max(0, j-target), upperRange=Math.min(99, j+target),

    这样的话,transfer function可以写成:

    for (int p=lowerRange; p<= upperRange; p++) {

      res[i][j] = Math.min(res[i][j], res[i-1][p] + Math.abs(j-A.get(i-1)));

    }

     1 public class Solution {
     2     /**
     3      * @param A: An integer array.
     4      * @param target: An integer.
     5      */
     6     public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
     7         // write your code here
     8         int[][] res = new int[A.size()+1][100];
     9         for (int j=0; j<=99; j++) {
    10             res[0][j] = 0;
    11         }
    12         for (int i=1; i<=A.size(); i++) {
    13             for (int j=0; j<=99; j++) {
    14                 res[i][j] = Integer.MAX_VALUE;
    15                 int lowerRange = Math.max(0, j-target);
    16                 int upperRange = Math.min(99, j+target);
    17                 for (int p=lowerRange; p<=upperRange; p++) {
    18                     res[i][j] = Math.min(res[i][j], res[i-1][p]+Math.abs(j-A.get(i-1)));
    19                 }
    20             }
    21         }
    22         int result = Integer.MAX_VALUE;
    23         for (int j=0; j<=99; j++) {
    24             result = Math.min(result, res[A.size()][j]);
    25         }
    26         return result;
    27     }
    28 }
  • 相关阅读:
    uva 11080(二分图染色)
    poj 3255(次短路)
    uva 707(记忆化搜索)
    uva 436(floyd变形)
    uva 11748(求可达矩阵)
    uva 11573(bfs)
    Codeforces Round #226 (Div. 2) 解题报告
    uva 11354(最小瓶颈路--多组询问 MST+LCA倍增)
    uva 534(最小瓶颈路)
    uva 538(简单图论 入度出度)
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4385819.html
Copyright © 2011-2022 走看看