首页 > 代码库 > hdu1158 dp
hdu1158 dp
1 //Accepted 232 KB 0 ms 2 //DP 3 //dp[i][j]表示第i个月人数为a[j]时的最小花费 4 //dp[i][j]=min(dp[i][j],dp[i-1][k]+hire*(a[j]-a[k])+pay*a[j]) a[j]>a[k]时 5 //dp[i][j]=min(dp[i][j],dp[i-1][k]+fire*(a[k]-a[j])+pay*a[j]) a[k]>=a[j]时 6 //a[i] 表示第i个月要用到的最少人数 7 // 8 #include <cstdio> 9 #include <cstring>10 #include <iostream>11 using namespace std;12 const int imax_n = 13;13 const int inf = 100000000;14 int a[imax_n];15 int dp[imax_n][imax_n];16 int hire,fire,pay;17 int n;18 19 int min(int a,int b)20 {21 return a>b?b:a;22 }23 int Dp()24 {25 for (int i=0;i<=n;i++)26 for (int j=0;j<=n;j++)27 dp[i][j]=inf;28 dp[0][0]=0;29 for (int i=1;i<=n;i++)30 {31 for (int j=0;j<=n;j++)32 if (a[j]>=a[i])33 {34 for (int k=0;k<=n;k++)35 {36 if (a[k]>a[j])37 dp[i][j]=min(dp[i][j],dp[i-1][k]+fire*(a[k]-a[j])+pay*a[j]);38 else39 dp[i][j]=min(dp[i][j],dp[i-1][k]+hire*(a[j]-a[k])+pay*a[j]);40 }41 }42 }43 int ans=inf;44 for (int i=0;i<=n;i++)45 ans=min(ans,dp[n][i]);46 printf("%d\n",ans);47 return ans;48 }49 int main()50 {51 while (scanf("%d",&n),n)52 {53 scanf("%d%d%d",&hire,&pay,&fire);54 for (int i=1;i<=n;i++)55 scanf("%d",&a[i]);56 a[0]=0;57 Dp();58 }59 return 0;60 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。