1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include
16 #include
17 using namespace std;
18 const int N=1002;
19 int f[12][N];
20 int m[12];
21 int hire,salary,fire;
22 int n;
23 int Max;
24 void DP()
25 {
26 int t;
27 memset(f,0,sizeof(f));
28 for(int k=m[0];k<=Max;k++)
29 f[0][k]=k*(hire+salary);
30 for(int i=1;i<n;i++)
31 {
32 for(int k=m[i];k<=Max;k++)
33 {
34 f[i][k]=INT_MAX;
35 for(int j=m[i-1];j<=Max;j++)
36 {
37 if(j<k)
38 t=k*salary+f[i-1][j]+(k-j)*hire;
39 else
40 t=k*salary+f[i-1][j]+(j-k)*fire;
41 if(f[i][k]>t)
42 f[i][k]=t;
43 }
44 }
45 }
46 int ans=INT_MAX;
47 for(int k=m[n-1];k<=Max;k++)
48 if(ans>f[n-1][k])
49 ans=f[n-1][k];
50 printf("%d\n",ans);
51 }
52 int main()
53 {
54 while(scanf("%d",&n),n)
55 {
56 scanf("%d %d %d",&hire,&salary,&fire);
57 Max=0;
58 for(int i=0;i<n;i++)
59 {
60 scanf("%d",&m[i]);
61 if(m[i]>Max)
62 Max=m[i];
63 }
64 DP();
65 }
66 }
hdu1558 参考答案 (2008-11-12 14:14:04由218编辑)