hdu 1158(いいdp問題)
7116 ワード
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1158
なかなかいい問題ですが、最初は見えませんでした...ブラシの問題が足りない!!!
View Code
なかなかいい問題ですが、最初は見えませんでした...ブラシの問題が足りない!!!
View Code
1 #include<iostream>
2 #include<algorithm>
3 const int inf=1e9;
4 const int N=14;
5 using namespace std;
6 int num[N];
7 int dp[N][111];//dp[i][j] i ( i ) j
8
9
10 int main(){
11 int n;
12 while(~scanf("%d",&n)&&n){
13 int hire,salary,fire;
14 scanf("%d%d%d",&hire,&salary,&fire);
15 int maxnum=0;
16 for(int i=1;i<=n;i++){
17 scanf("%d",&num[i]);
18 maxnum=max(maxnum,num[i]);
19 }
20 for(int i=num[1];i<=maxnum;i++){
21 dp[1][i]=(salary+hire)*i;// !!!
22 }
23 for(int i=2;i<=n;i++){
24 for(int j=num[i];j<=maxnum;j++){
25 int MIN=inf;
26 for(int k=num[i-1];k<=maxnum;k++){
27 if(k<j){
28 MIN=min(MIN,dp[i-1][k]+(j-k)*hire+j*salary);
29 }else {
30 MIN=min(MIN,dp[i-1][k]+(k-j)*fire+j*salary);
31 }
32 }
33 dp[i][j]=MIN;
34 }
35 }
36 int ans=inf;
37 for(int i=num[n];i<=maxnum;i++){
38 ans=min(ans,dp[n][i]);
39 }
40 printf("%d
",ans);
41 }
42 return 0;
43 }