经典dp题 这段时间训练都在做数学题 , 崩溃了 , 各种公式的各种运用 , 头晕 , 还是做做dp题好玩. 首先我们来推推转移方程 (听说这题用最多105人 可以暴力过 不过木试过) 经理对每个月都可以炒员工鱿鱼(f) , 招人 (h),和必定对留下的人发薪金(s) 那么对每个月来所说,人数(renn m)最多是个个月数用人的最大值 , 最小是当月规定的人数即 renn m[i] = k = max{renn m[1....n]} 因此每个月留在的人数都是一个区间里数 , 人数的变化要根据前一个区间的人数 不难得出 第i月 要j人 前一个月 的每个 renn m[i] = k = max{renn m[1....n]} 根据此 更新 每个renn m[i] = j = max{renn m[1....n]} 这个区间的所有dp[i][j] 第 if(j = k) cost = ( h*(j - k) )+s*j + dp[i-1][k]; else cost = ( f*(k - j) )+s*j + dp[i-1][k]; 最后取n月的 renn m[i] = kn = max{renn m[1....n]} 的最小值 #incl de iostream #incl de string #incl de cmath #incl de cstdio #incl de cstring #incl de cstdlib sing namespace std; int main { int n; while(scanf("%d",&n),n) { int h,s,f; scanf("%d%d%d",&h,&s,&f); co thsfendl; int renn m[13] = {0}; int max_n = 0; for(int i = 1 ; i = n ; i) { scanf("%d",&renn m[i]); if(max_n  renn m[i]) max_n = renn m[i];