http://acm.hdu.edu.cn/showproblem.php?pid=1158
dp[i][j] 表示第i月留j个人最少的话费
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define Debug cout<<"cross!"<<endl
int people[105];
int dp[15][1050];
const int inf=1000000000;
int main()
{
int n;
while(scanf("%d",&n),n)
{
int hire,salary,fire;
int maxn=-1;
scanf("%d%d%d",&hire,&salary,&fire);
for(int i=1;i<=n;i++)
{
scanf("%d",&people[i]);
maxn=max(maxn,people[i]);
}
for(int i=1;i<=n;i++)
for(int j=0;j<=maxn;j++)
dp[i][j]=inf;
for(int i=0;i<=maxn;i++)
dp[1][i]=hire*i+salary*i;
for(int i=2;i<=n;i++)
{
for(int j=people[i];j<=maxn;j++)
{
for(int k=people[i-1];k<=maxn;k++)
{
if(k>j)
dp[i][j]=min(dp[i][j],dp[i-1][k]+fire*(k-j)+j*salary);
else
dp[i][j]=min(dp[i][j],dp[i-1][k]+hire*(j-k)+j*salary);
}
}
}
int mins=inf;
for(int i=people[n];i<=maxn;i++)
mins=min(dp[n][i],mins);
printf("%d\n",mins);
}
}