码迷,mamicode.com
首页 > 其他好文 > 详细

LintCode-最小调整代价

时间:2015-05-22 00:34:14      阅读:599      评论:0      收藏:0      [点我收藏+]

标签:面试   lintcode   

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

样例

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

注意

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

分析:一般这种题,每个位置上都有很多种可能,基本上就是动态规划了,又因为每个位置最多100,于是可以枚举每个位置的数值,用dp[i][j]表示到第i个数为止,第i个数变成j后的最小调整代价,状态转移只和i-1有关,可以进行空间优化。

代码:

class Solution {
public:
    /**
     * @param A: An integer array.
     * @param target: An integer.
     */
    int MinAdjustmentCost(vector<int> A, int target) {
        // write your code here
        if(A.size()<2)
            return 0;
        vector<vector<int> > dp(A.size(),vector<int>(101,0));
        for(int i=0;i<101;i++)
            dp[0][i] = abs(A[0]-i);
        for(int i=1;i<A.size();i++)
        {
            for(int j=0;j<101;j++)
            {
                dp[i][j] = INT_MAX;
                int diff = abs(j-A[i]);
                int upper = min(j+target,100);
                int lower = max(j-target,0);
                for(int k=lower;k<=upper;k++)
                {
                    dp[i][j] = min(dp[i][j],dp[i-1][k]+diff);
                }
            }
        }
        int ret = INT_MAX;
        for(int i=0;i<101;i++)
            ret = min(ret,dp[A.size()-1][i]);
        return ret;
        
    }
};


LintCode-最小调整代价

标签:面试   lintcode   

原文地址:http://blog.csdn.net/wangyuquanliuli/article/details/45899311

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!