题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3874
题目大意:
N(1 <= N <= 100)个数排成一行,值分别为A_i,现在希望把每个数对应地改成B_i。(A_i,B_i的值均在0..10之间)。改变的方式有3种:
(1)把A_i增加到B_i,每增加1,花费$X
(2)把A_i减少到B_i,每减少1,花费$Y
(3)把第i个数的值转移到第j个数,每转移1,花费为$Z*|i-j|
问:最小的花费是多少。
分析:用dp[i][j]表示位置i+1..n已达到要求(分别等于b[i])且位置i当前值为j的状态。如果j > b[i],那么位置i要减少j - b[i],可以直接减少,也可以把减少的部分加到位置1..i-1上,枚举就好了。j < b[i]的情况就增加。注意可能后面的位置都是a[i] > b[i],那么多余的部分就会不停地往前累加,所以j可能会比较大,而且可能为负(数组下标平移就行了),开数组时注意。
#include
#include
#include
#include
#include
#include