题目在这里
————————————————————————————————
Employment Planning
简单的一道dp 关键的点在于想到用枚举实现各种情况的讨论
关键的注释写在代码里了 还是很清晰的捏~
#include <bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
#define foo(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
using namespace std;
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
const int Ratio=0;
const int N=10005;
const int maxx=INT_MAX;
int n,cb,gz,jg;
int maax,miin,sum;
int dh[15],zl[N][15];//i个人j月
void read()
{
cb=qr,gz=qr,jg=qr;
fo(i,1,n)
dh[i]=qr,maax=max(maax,dh[i]);//取一下人数最多的值 方便考虑
}
void DrRatio()
{
fo(i,dh[1],maax)//第一个月特殊先算
zl[i][1]=i*(cb+gz);
fo(i,2,n)
fo(j,dh[i],maax)//枚举可能的人数
{
miin=maxx;
fo(k,dh[i-1],maax)//比较上一个月
{
sum=0;
if(k>=j)//人少了 开除
sum=zl[k][i-1]+(k-j)*jg+j*gz;
else//人多了 招聘
sum=zl[k][i-1]+(j-k)*cb+j*gz;
miin=min(miin,sum);
}
//因为把所有情况都枚举了 所以不用担心有不干活也不开除却更便宜的情况没被考虑
zl[j][i]=miin;
}
miin=maxx;
fo(i,dh[n],maax)//最后找最后一个月所有情况中便宜的那种 就是最优
miin=min(miin,zl[i][n]);
}
void op()
{
printf("%d\n",miin);
}
int main()
{
while(scanf("%d",&n)&&n)
{
maax=0;
read();
DrRatio();
op();
}
return Ratio;
}
标签:zl,HDU,ch,int,题解,sum,miin,Planning
From: https://www.cnblogs.com/DrRatio-DanhengYinyue1007/p/18017141