最小调整代价
本题运用动态规划来实现:
首先我们阅读题目,发现是序列问题,且目标中与每一个序列之间关联,存在子问题。所以本题尝试使用动态规划进行解决。
我们定义DP[i][j]为A[i]=j时,我们需要调整的最小代价,则前一个DP[i-1][k]的消耗加上abs(j-A[i])。
所以我们进行以下定义
DP[i][j]=DP[i][k]+abs(j-A[i])
class Solution {
public:
/*
* @param A: An integer array
* @param target: An integer
* @return: An integer
*/
int MinAdjustmentCost(vector<int> &A, int target) {
// write your code here
int n=A.size();
//dp[i][j]代表第i个元素即A[i]=j时,A[i]与A[i-1]差值不大于target所需要付出的最小代价
int dp[n][101];
//初始化数组
for(int i=0;i<n;i++)
for(int j=1;j<=100;j++)
dp[i][j]=0x3f3f3f3f;
for(int i=0;i<n;i++)
for(int j=0;j<101;j++)
{
if(i==0)
//A[0]调整为j的代价
dp[0][j]=abs(j-A[0]);
else {
for(int k=max(1,j-target);k<=min(100,j+target);k++)
{
//当A[i-1]=k时,答案为A[i-1]=k的代价dp[i-1][k],加上A[i]=调整为j的代价abs(j-A[i])
dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(j-A[i]));
}
}
}
int mincost=0x3f3f3f3f;
for(int i=1;i<=100;i++)
mincost=min(mincost,dp[n-1][i]);
return mincost;
}
};