题目
给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。
你可以假设数组中每个整数都是正整数,且小于等于100。
解题
参考博客 比较复杂,自己还不能够理解,先占坑。
public class Solution { /** * @param A: An integer array. * @param target: An integer. */ public int MinAdjustmentCost(ArrayList<Integer> A, int target) { // write your code here int lenA = A.size(); int M[][] = new int[lenA][100]; for(int i=0;i<A.size();i++){ for(int j=0;j< 100;j++) M[i][j] = Integer.MAX_VALUE; } return helper(A,new ArrayList<Integer>(A),target,0,M); } public int helper(ArrayList<Integer> A,ArrayList<Integer> B,int target,int index, int[][] M){ int len = A.size(); if(index >=len){ return 0; } int diff = 0; int MIN = Integer.MAX_VALUE; for(int i=1; i<=100;i++){ if(index !=0 && Math.abs( i - B.get(index -1)) > target) continue; if(M[index][i-1] !=Integer.MAX_VALUE){ diff = M[index][i -1]; MIN = Math.min(MIN,diff); continue; } B.set(index,i); diff = Math.abs(i - A.get(index)); diff += helper(A,B,target,index + 1,M); MIN = Math.min(MIN,diff); M[index][i-1] = diff; B.set(index,A.get(index)); } return MIN; } }
lintcode 中等题:minimum adjustment cost 最小调整代价
原文:http://www.cnblogs.com/theskulls/p/5136219.html