最小调整代价

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

样例

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

注意

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

class Solution {
public:
    /**
     * @param A: An integer array.
     * @param target: An integer.
     */
    int MinAdjustmentCost(vector<int> A, int target) {
        // write your code here
        int n = A.size();
	    if (n < 2)
	    {
		    return 0;
	    }

	    int buf[n][101];
	    for (int i = 1; i <= 100; i++)
	    {
		    buf[0][i] = abs(i-A[0]);
	    }

	    for (int i = 1; i < n; i++)
	    {
		    for (int j = 1; j <= 100; j++)
		    {
			    int left = max(j-target, 1);
			    int right = min(j+target, 100);
			    buf[i][j] = INT_MAX;
			    for (int k = left; k <= right; k++)
			    {
				    buf[i][j] = min(buf[i][j], buf[i-1][k]+abs(A[i]-j));
			    }
		    }
	    }

	    int result = INT_MAX;
	    for (int i = 1; i <= 100; i++)
	    {
		    result = min(result, buf[n-1][i]);
	    }

	    return result;
    }
};

 
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值