LintCode 最小调整代价

作者: 六尺帐篷 | 来源:发表于2017-03-02 20:15 被阅读195次

题目

给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。

注意事项
你可以假设数组中每个整数都是正整数,且小于等于100。

样例
对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。

分析

动态规划,一个元素一个元素的调整,由于是要求相邻元素的差值,所以只和前一个相邻元素的值有关,所以只需要记录上一个调整的值就可以。
那么。dp[i][j]表示调整到第i个数时,此时,第i个数取值j,为代价和最小。
显然,假设dp[i-1][k]已知,则dp[i][j] = dp[i-1][k] + abs(j-A[i])
由于j和k都有多种可能取值,所以循环求解判断,k表示前一个数,j表示现在的数,假设j确定,那么k的取值就是在一个范围内,因为差值不能超过target。

代码

public class Solution {
    /**
     * cnblogs.com/beiyeqingteng/
     */
    public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
        if (A == null || A.size() == 0) return 0;
        int max = getMax(A);
        int[][] costs = new int[A.size()][max + 1];
        
        for (int i = 0; i < costs.length; i++) {
            for (int j = 1; j <= max; j++) {
                costs[i][j] = Integer.MAX_VALUE;
                if (i == 0) {
                    // for the first number in the array, we assume it ranges from 1 to max;
                    costs[i][j] = Math.abs(j - A.get(i));
                } else {
                    // for the number A.get(i), if we change it to j, then the minimum total cost
                    // is decided by Math.abs(j - A.get(i)) + costs[i - 1][k], and the range of
                    // k is from Math.max(1, j - target) to Math.min(j + target, max)
                    for (int k = Math.max(1, j - target); k <= Math.min(j + target, max); k++) {
                        costs[i][j] = Math.min(costs[i][j], Math.abs(j - A.get(i)) + costs[i - 1][k]);
                    }
                }
            }
        }
        
        int min = Integer.MAX_VALUE;
        for (int i = 1; i < costs[0].length; i++) {
            min = Math.min(min, costs[costs.length - 1][i]);
        }
        return min;
    }
    
    private int getMax(ArrayList<Integer> A) {
        int max = A.get(0);
        for (int i = 1; i < A.size(); i++) {
            max = Math.max(max, A.get(i));
        }
        return max;
    }
}

相关文章

  • LintCode 最小调整代价

    给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的...

  • LintCode 最小调整代价

    题目 给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整...

  • 最小调整代价 lintcode91

    题目 给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整...

  • lintcode 最小子数组

    给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。样例给出数组[1, -1, -2, 1],返回 -3解...

  • 机器学习问题及分析笔记

    最小平方差代价函数 梯度下降步骤 梯度下降解决了什么问题?答:梯度下降解决代价函数某一点上最小化问题,将代价函数收...

  • LintCode最小路径和

    给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。样例注意你在同一时间只能向下或...

  • LintCode 最小路径和

    题目 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。 ** 注意事项你在同一...

  • lintcode 最小子串覆盖

    给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。注...

  • LintCode - 最小子数组(容易)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 难度:容易 要求: 给定一个整数数组,找到一个具有最小和的子...

  • OJ lintcode 最小子数组

    给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。注意事项子数组最少包含一个数字您在真实的面试中是否遇到...

网友评论

    本文标题:LintCode 最小调整代价

    本文链接:https://www.haomeiwen.com/subject/hsmkgttx.html