#include <iostream>
#include <cmath>
#include <algorithm>
#include <climits>
using namespace std;
#define MAX_NUMBER 100
class Solution {
public:
int getMinimumAdjust(int *arr, int n, int targetMaxDiff) {
static int result1[MAX_NUMBER + 1], result2[MAX_NUMBER + 1];
if (n < 2)
return 0;
int *prevResult = &result1[0], *curResult = &result2[0];
//Initialize with the last element of array
for (int i = 0; i <= MAX_NUMBER; ++i)
prevResult[i] = abs(arr[n - 1] - i);
// Run DP
int minK = 0, maxK = 0, curDiff = INT_MAX;
for (int i = n - 2; i >= 0; --i) {
for (int j = 0; j <= MAX_NUMBER; ++j) {
minK = max(0, j - targetMaxDiff);
maxK = min(MAX_NUMBER, j + targetMaxDiff);
curResult[j] = INT_MAX;
for (int k = minK; k <= maxK; ++k)
curResult[j] = min(curResult[j], abs(j - arr[i]) + prevResult[k]);
}
swap(prevResult, curResult);
}
curDiff = INT_MAX;
for (int i = 0; i <= MAX_NUMBER; ++i)
curDiff = min(curDiff, prevResult[i]);
return curDiff;
}
};
int main() {
Solution so;
int arr1[] = {1, 4, 2, 3};
int n = sizeof(arr1) / sizeof(arr1[0]);
int target = 1;
cout << "Min Cost of arr1 is " << so.getMinimumAdjust(arr1, n, target) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjbGltaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBNQVhfTlVNQkVSICAxMDAKCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgaW50IGdldE1pbmltdW1BZGp1c3QoaW50ICphcnIsIGludCBuLCBpbnQgdGFyZ2V0TWF4RGlmZikgewogICAgICAgIHN0YXRpYyBpbnQgcmVzdWx0MVtNQVhfTlVNQkVSICsgMV0sIHJlc3VsdDJbTUFYX05VTUJFUiArIDFdOwogICAgICAgIGlmIChuIDwgMikKICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIGludCAqcHJldlJlc3VsdCA9ICZyZXN1bHQxWzBdLCAqY3VyUmVzdWx0ID0gJnJlc3VsdDJbMF07CgogICAgICAgIC8vSW5pdGlhbGl6ZSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJyYXkKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBNQVhfTlVNQkVSOyArK2kpCiAgICAgICAgICAgIHByZXZSZXN1bHRbaV0gPSBhYnMoYXJyW24gLSAxXSAtIGkpOwogICAgCiAgICAgICAgLy8gUnVuIERQCiAgICAgICAgaW50IG1pbksgPSAwLCBtYXhLID0gMCwgY3VyRGlmZiA9IElOVF9NQVg7CiAgICAgICAgZm9yIChpbnQgaSA9IG4gLSAyOyBpID49IDA7IC0taSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBNQVhfTlVNQkVSOyArK2opIHsKICAgICAgICAgICAgICAgIG1pbksgPSBtYXgoMCwgaiAtIHRhcmdldE1heERpZmYpOwogICAgICAgICAgICAgICAgbWF4SyA9IG1pbihNQVhfTlVNQkVSLCBqICsgdGFyZ2V0TWF4RGlmZik7CiAgICAgICAgICAgICAgICBjdXJSZXN1bHRbal0gPSBJTlRfTUFYOwoKICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBtaW5LOyBrIDw9IG1heEs7ICsraykKICAgICAgICAgICAgICAgICAgICBjdXJSZXN1bHRbal0gPSBtaW4oY3VyUmVzdWx0W2pdLCBhYnMoaiAtIGFycltpXSkgKyBwcmV2UmVzdWx0W2tdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dhcChwcmV2UmVzdWx0LCBjdXJSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgY3VyRGlmZiA9IElOVF9NQVg7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gTUFYX05VTUJFUjsgKytpKQogICAgICAgICAgICBjdXJEaWZmID0gbWluKGN1ckRpZmYsIHByZXZSZXN1bHRbaV0pOwogICAgICAgIHJldHVybiBjdXJEaWZmOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzbzsKCiAgICBpbnQgYXJyMVtdID0gezEsIDQsIDIsIDN9OwogICAgaW50IG4gPSBzaXplb2YoYXJyMSkgLyBzaXplb2YoYXJyMVswXSk7CiAgICBpbnQgdGFyZ2V0ID0gMTsKCiAgICBjb3V0IDw8ICJNaW4gQ29zdCBvZiBhcnIxIGlzICIgPDwgc28uZ2V0TWluaW11bUFkanVzdChhcnIxLCBuLCB0YXJnZXQpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=