最小调整代价

时间:2022-09-20 21:37:29
给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
 注意事项
你可以假设数组中每个整数都是正整数,且小于等于100。
样例

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


import java.util.ArrayList;
import java.util.Scanner;

/**
*
* 给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
注意事项
你可以假设数组中每个整数都是正整数,且小于等于100。
样例
对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。
* @author Dell
*
*/
public class Test191 {

public static int MinAdjustmentCost(ArrayList<Integer> A, int target)
{
//设dp[i][j]表示到第i个数为止,第i个数变成j后所形成的的最小调整代价。
if(A.size()<2)
return 0;
int[][] dp=new int[A.size()][101];

for(int j=0;j<101;j++)
{
dp[0][j]=Math.abs(A.get(0)-j);
}
for(int i=1;i<A.size();i++)
{
for(int j=0;j<101;j++)
{
dp[i][j]=Integer.MAX_VALUE;
int dif=Math.abs(A.get(i)-j);
int max=Math.min(j+target, 100);
int min=Math.max(j-target, 0);
for(int q=min;q<=max;q++)
{
dp[i][j]=Math.min(dp[i][j], dp[i-1][q]+dif);
}


}

}

int ret=Integer.MAX_VALUE;
for(int i=0;i<101;i++)
{
ret=Math.min(ret, dp[A.size()-1][i]);
}

return ret;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ArrayList<Integer> list=new ArrayList<>();
for(int i=0;i<n;i++)
{
list.add(sc.nextInt());
}
int target=sc.nextInt();
System.out.println(MinAdjustmentCost(list,target));
}

}