题意:给出n个月,雇佣一个人所需的钱hire,一个人工作一个月所需要的钱salary,解雇一个人所需要的钱fire,再给出这n个月每月1至少有num[i]个人完成工作,问完成整个工作所花费的最少的钱是多少。

用dp[i][j]表示在第i个月雇佣j个人所需要的最少花费

先考虑只解雇人和聘请人的情况

  1. for(j=num[i];j<=sum;j++)
  2. {
  3. if(j>num[i-])//说明雇佣了人
  4. dp[i][j]=dp[i-][num[i-]]+j*salary+(j-num[i-])*hire;
  5. else//说明解聘了人
  6. dp[i][j]=dp[i-][num[i-]]+j*salary+(num[i-]-j)*fire;
  7. }

再考虑状态转移,可以举一个例子--
假如一个人的工资是5元,但是解雇他要花500元,这样比较下,把这个人留在下一个月继续工作显然开销会小很多,同理对于k个人也是一样的。

  1. for(k=num[i-]+;k<=sum;k++)
  2. {
  3. if(k<j) //不够下一个月的人数,需要聘请人
  4. dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(j-k)*hire);
  5. else//超过下一个 月的人数,需要解雇人
  6. dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(k-j)*fire);
  7. }

然后就是初始化,对于第一个月, 花的钱为:(hire+salary)*人数

最后扫一遍最后一个月雇佣不同人数(在满足人数大于num[n-1]的情况下),得出最小值。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. int dp[][];
  8. int num[];
  9.  
  10. int main()
  11. {
  12. int n,i,j,k,ans,hire,salary,fire,sum;
  13. while(scanf("%d",&n)!=EOF&&n)
  14. { sum=-;
  15. scanf("%d %d %d",&hire,&salary,&fire);
  16. for(i=;i<n;i++) {scanf("%d",&num[i]);sum=max(sum,num[i]);}
  17. memset(dp,,sizeof(dp));
  18.  
  19. for(i=num[];i<=sum;i++)
  20. dp[][i]=i*(hire+salary);
  21.  
  22. for(i=;i<n;i++)
  23. {
  24. for(j=num[i];j<=sum;j++)
  25. {
  26. if(j>num[i-])//说明雇佣了人
  27. dp[i][j]=dp[i-][num[i-]]+j*salary+(j-num[i-])*hire;
  28. else//说明解聘了人
  29. dp[i][j]=dp[i-][num[i-]]+j*salary+(num[i-]-j)*fire;
  30. for(k=num[i-]+;k<=sum;k++)
  31. {
  32. if(k<j) //不够下一个月的人数,需要聘请人
  33. dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(j-k)*hire);
  34. else//超过下一个 月的人数,需要解雇人
  35. dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(k-j)*fire);
  36. }
  37. }
  38. }
  39. ans=;
  40. for(i=num[n-];i<=sum;i++)
  41. ans=min(ans,dp[n-][i]);
  42. printf("%d\n",ans);
  43. }
  44. return ;
  45. }

这一题= =没有想出状态,没有想出方程= =全程看题解===还看了3天--55555

第一天:读懂了题目==木有思路

第二天:继续不懂==

第三天:看题解= =懂一丢丢= =

大概一道题目,一时不会,放着慢慢来,每天看一看,可能就会好一些 加油加油---go---go---

HDU 1158 Employment Planning【DP】的更多相关文章

  1. HDU 1158 Employment Planning (DP)

    题目链接 题意 : n个月,每个月都至少需要mon[i]个人来工作,然后每次雇佣工人需要给一部分钱,每个人每个月还要给工资,如果解雇人还需要给一笔钱,所以问你主管应该怎么雇佣或解雇工人才能使总花销最小 ...

  2. hdu 1158 Employment Planning(DP)

    题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...

  3. Hdu 1158 Employment Planning(DP)

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1158 一道dp题,或许是我对dp的理解的还不够,看了题解才做出来,要加油了. 只能先上代码了 ...

  4. HDU - 1176 免费馅饼 【DP】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路 因为刚开始的起点是固定的 但是终点不是固定的 所以我们可以从终点往起点推 dp[i][j] ...

  5. HDU 1158 Employment Planning

    又一次看题解. 万事开头难,我想DP也是这样的. 呵呵,不过还是有进步的. 比如说我一开始也是打算用dp[i][j]表示第i个月份雇j个员工的最低花费,不过后面的思路就完全错了.. 不过这里还有个问题 ...

  6. HDU 1058 Humble Numbers【DP】

    题意:给出丑数的定义,只含有2,3,5,7这四个素数因子的数称为素数.求第n个丑数. 可以先观察几个丑数得出规律 1:dp[1] 2:min(1*2,1*3,1*5,1*7) 3:min(2*2,1* ...

  7. HDU - 1003 Max Sum 【DP】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1003 题意 给出一个序列 要求找出一个和最大的子序列 思路 O(N)的做法 但是要标记 子序列的头部位 ...

  8. hdu 5375 Gray code 【 dp 】

    dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ...

  9. HDU 5234 Happy birthday【DP】

    题意:给出n*m的格子,每个格子的值为w[i][j],在值不超过k的时候,可以往右或者往下走,问从(1,1)走到(n,m)能够得到的最大的值 类似于背包 d[i][j][k]=maxx(d[i-1][ ...

随机推荐

  1. JS正则汇总

    1.基本定义: \s:用于匹配单个空格符,包括tab键和换行符; \S:用于匹配除单个空格符之外的所有字符; \d:用于匹配从0到9的数字; \w:用于匹配字母,数字或下划线字符; \W:用于匹配所有 ...

  2. Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起

    本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口 ...

  3. SiteView

    http://www.siteview.com/cms/sites/public/home.html

  4. typedef (还需经常看看加深理解)

    看了 c++primer 1,typedef名字 typedef定义以关键字typedef开始,后面是 数据类型+标示符. 并未引入新的类型,只是现有数据类型的同义词 例: typedef doubl ...

  5. ios开发中超简单抽屉效果(MMDrawerController)的实现

    ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...

  6. PHP组合模式、策略模式

    一.问题 模拟不同课程有不同的收费方式,并且能灵活改变(新增或删减),如讲座可以固定收费也可改为按时收费,研讨会也是. 二.模式简介及关键点 1.在父类代码中使用条件语句是一种退倒,可以用多态来代替条 ...

  7. WordPress主题制作教程9:文章形式

    wordpress的文章形式: aside -----------------日志:不显示标题的标准文章image --------------图像:单张图像.文章中的首个 <img /> ...

  8. iOS keyChain

    keychain在ios中是保存在sqlite数据库中的. 这个数据库文件的位置: 真机: /private/var/Keychains/keychain-2.db 虚拟机: /Users/USER- ...

  9. Jenkins最佳实践

    原文:http://www.cnblogs.com/itech/archive/2011/11/14/2248460.html Jenkins最佳实践,其实大部分对于其他的CI工具同样的适用: * J ...

  10. 304. Range Sum Query 2D - Immutable

    题目: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper ...