基础动态规划题。
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int dp[12][1000]; //dp[i][j]表示目前有j名员工时,从第1个月到第i个月的最小花费
int people[15]; //每月所需员工数
int main()
{
int n;
while (cin >> n)
{
if (n == 0)
break;
memset(dp, INF, sizeof(dp));
int hire, salary, fire;
cin >> hire >> salary >> fire;
int maxPeople = 0; //每月所需的最大员工数
for (int i = 0; i < n; i++)
{
cin >> people[i];
maxPeople = max(maxPeople, people[i]);
}
int result = INF;
int j, k = 0; //j为本月所需员工数,k为上月所需员工数
for (int i = 0; i < n; i++)
{
for (j = people[i]; j <= maxPeople; j++)
{
if (i == 0) //第一个月
dp[i][j] = j * hire + j * salary;
else
{
for (k = people[i - 1]; k <= maxPeople; k++)
{
int p;
if (j >= k) //本月所需员工数大于上月,需要hire
{
p = j - k;
dp[i][j] = min(j * salary + p * hire + dp[i - 1][k], dp[i][j]);
}
if (j < k) //本月所需员工数小于上月,需要fire
{
p = k - j;
dp[i][j] = min(j * salary + p * fire + dp[i - 1][k], dp[i][j]);
}
}
}
if (i == n - 1)
{
result = min(result, dp[i][j]);
}
}
}
cout << result << endl;
}
return 0;
}