dp[i][j] 表示从 1 ~ i个月有 j 个工人的支出最少。
dp[i][j] = min ( dp[i - 1][k] + cost, dp[i][j] ) // k = month[i - 1] ~ Max; Max 表示最多需要的人数
j > k cost = ( j - k ) * hire + j * salary;
j < k cost = ( k - j ) * fire + j * salary;
ans = min ( dp[n][i] ) // i = month[n] ~ Max
#include <stdio.h>
int min ( int a, int b ) {
return a < b ? a : b;
}
int Case, month[13], dp[13][100], hire, salary, fire, cost;
int main ( ) {
while ( scanf ( "%d", &Case ) && Case ) {
scanf ( "%d%d%d", &hire, &salary, &fire );
int Max = 0;
for ( int i = 1; i <= Case; ++i ) {
scanf ( "%d", &month[i] );
if ( month[i] > Max ) Max = month[i];
}
for ( int i = month[1]; i <= Max; ++i ) dp[1][i] = i * ( hire + salary );
for ( int i = 2; i <= Case; ++i ) {
for ( int j = month[i]; j <= Max; ++j ) {
dp[i][j] = 100000000;
for ( int k = month[i - 1]; k <= Max; ++k ) {
if ( j > k ) cost = ( j - k ) * hire + j * salary;
else cost = ( k - j ) * fire + j * salary;
dp[i][j] = min ( dp[i][j], dp[i - 1][k] + cost );
}
}
}
int ans = dp[Case][month[Case]];
for ( int i = month[Case] + 1; i <= Max; ++i )
if ( ans > dp[Case][i] ) ans = dp[Case][i];
printf ( "%d\n", ans );
}
}