题目:hdu1158
题意:输入num个月,输入每个月雇佣员工、员工薪资、解雇员工所用的钱。输入每个月至少需要多少个员工(num个数)。
解答:dp.注意初始状况:第一个月要分开讨论。注意每一段的取值范围。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 100 + 10;
const int INF = 0xffffff;
int t[13];
int dp[13][MAXN];
int main()
{
int num,a,b,c;
while(~scanf("%d",&num))
{
if(num == 0)
break;
scanf("%d%d%d",&a,&b,&c);
int Max = 0;
for(int i = 1;i <= num;i++)
{
scanf("%d",&t[i]);
if(t[i] > Max)
Max = t[i];
}
t[0] = 0;
memset(dp,0,sizeof(dp));
for(int j = 0;j <= Max;j++)
dp[1][j] = (a+b)*j;
for(int i = 2;i <= num;i++)
{
for(int j = t[i];j <= Max;j++)//j表示第i个月雇佣的人的个数
{
int tmp = INF;
for(int k = t[i-1];k <= Max;k++)//k表示第i-1个月雇佣的人的个数
{
if(k <= j)
tmp = min(tmp,dp[i-1][k]+(j-k)*a+b*j);
else
tmp = min(tmp,dp[i-1][k]+(k-j)*c+j*b);///!
}
dp[i][j] = tmp;
}
}
int ans = INF;
for(int i = t[num];i <= Max;i++)
ans = min(ans,dp[num][i]); ///!!!
printf("%d\n",ans);
}
return 0;
}
(叹号的地方是犯错的地方,因为j就表示这个月雇佣的人数,所以只有两种情况!!)