最小调整代价-LintCode

来源:互联网 发布:新手淘宝客能赚到钱吗 编辑:程序博客网 时间:2024/06/07 01:44

给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
样例:
对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。
思想:动态规划

#ifndef C91_H#define C91_H#include<iostream>#include<vector>#include<algorithm>using namespace std;class Solution {public:    /**    * @param A: An integer array.    * @param target: An integer.    */    int MinAdjustmentCost(vector<int> A, int target) {        // write your code here        int len = A.size();        if (len < 2)            return 0;        vector<vector<int>> cur(len, vector<int>(101, 0));        for (int i = 0; i < 101; ++i)            cur[0][i] = abs(A[0] - i);        for (int i = 1; i < len; ++i)        {            for (int j = 0; j < 101; ++j)            {                cur[i][j] = INT_MAX;                int diff = abs(A[i] - j);                int upper = min(j + target, 100);                int lower = max(j - target, 0);                for (int k = lower; k <= upper; ++k)                    cur[i][j] = min(cur[i][j], cur[i - 1][k] + diff);            }        }        int cost = INT_MAX;        for (int i = 0; i < 101; ++i)            cost = min(cost, cur[len - 1][i]);        return cost;    }};#endif