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                 else
39                 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 }

hdu1158 dp

时间: 2024-08-29 03:08:23

hdu1158 dp的相关文章

hdu1158 dp经典题

题意:已知雇佣员工花费(h).解雇员工花费(f).员工每月薪水(s),员工未被解雇的话即使未工作也要付薪水,现知道每个月需要几名员工,求最低花费. 很显然,刷 DP 专题的我早早地就意识到这是一道 DP 题(呵呵,废话你在刷DP```),我最开始的思路是这样的,开一个一维数组 dp [ i ]  来记录第 i 个月的最低花费情况,同时另开一个平行数组记录该情况下的人数,通过第 i 月的需求人数与上个月的最优情况的人数比较,进行 DP .但是很快我就发现,情况的种类很多很复杂,并且在第 i 个月的

HDU1158:Employment Planning(DP)

Problem Description A project manager wants to determine the number of the workers needed in every month. He does know the minimal number of the workers needed in each month. When he hires or fires a worker, there will be some extra cost. Once a work

HDU1158 Employment Planning 基础DP

Employment Planning Problem Description A project manager wants to determine the number of the workers needed in every month. He does know the minimal number of the workers needed in each month. When he hires or fires a worker, there will be some ext

HDU1158:Employment Planning(线性dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158 这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一个人需要花费m2的钱,然后给出n的数字, 代表每月需要的最少员工,问如何进行人员调整使最终花费的钱最少. 我已开始就推错了状态转移方程,因为给出的是最少的员工,所以要从当前最少员工~最多员工枚举. 还有每次需要比较num[i-1]与num[i]的大小,具体实现请看代码. #include <iost

hdu1158 Employment Planning(dp)

题目传送门 Employment Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6242    Accepted Submission(s): 2710 Problem Description A project manager wants to determine the number of the workers

DP总结 ——QPH

常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&