给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数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; } };
时间: 2024-10-25 13:14:04