HDU 1158 Employment Planning【DP】
题意:给出n个月,雇佣一个人所需的钱hire,一个人工作一个月所需要的钱salary,解雇一个人所需要的钱fire,再给出这n个月每月1至少有num[i]个人完成工作,问完成整个工作所花费的最少的钱是多少。
用dp[i][j]表示在第i个月雇佣j个人所需要的最少花费
先考虑只解雇人和聘请人的情况
for(j=num[i];j<=sum;j++)
{
if(j>num[i-])//说明雇佣了人
dp[i][j]=dp[i-][num[i-]]+j*salary+(j-num[i-])*hire;
else//说明解聘了人
dp[i][j]=dp[i-][num[i-]]+j*salary+(num[i-]-j)*fire;
}
再考虑状态转移,可以举一个例子--
假如一个人的工资是5元,但是解雇他要花500元,这样比较下,把这个人留在下一个月继续工作显然开销会小很多,同理对于k个人也是一样的。
for(k=num[i-]+;k<=sum;k++)
{
if(k<j) //不够下一个月的人数,需要聘请人
dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(j-k)*hire);
else//超过下一个 月的人数,需要解雇人
dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(k-j)*fire);
}
然后就是初始化,对于第一个月, 花的钱为:(hire+salary)*人数
最后扫一遍最后一个月雇佣不同人数(在满足人数大于num[n-1]的情况下),得出最小值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int dp[][];
int num[]; int main()
{
int n,i,j,k,ans,hire,salary,fire,sum;
while(scanf("%d",&n)!=EOF&&n)
{ sum=-;
scanf("%d %d %d",&hire,&salary,&fire);
for(i=;i<n;i++) {scanf("%d",&num[i]);sum=max(sum,num[i]);}
memset(dp,,sizeof(dp)); for(i=num[];i<=sum;i++)
dp[][i]=i*(hire+salary); for(i=;i<n;i++)
{
for(j=num[i];j<=sum;j++)
{
if(j>num[i-])//说明雇佣了人
dp[i][j]=dp[i-][num[i-]]+j*salary+(j-num[i-])*hire;
else//说明解聘了人
dp[i][j]=dp[i-][num[i-]]+j*salary+(num[i-]-j)*fire;
for(k=num[i-]+;k<=sum;k++)
{
if(k<j) //不够下一个月的人数,需要聘请人
dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(j-k)*hire);
else//超过下一个 月的人数,需要解雇人
dp[i][j]=min(dp[i][j],dp[i-][k]+j*salary+(k-j)*fire);
}
}
}
ans=;
for(i=num[n-];i<=sum;i++)
ans=min(ans,dp[n-][i]);
printf("%d\n",ans);
}
return ;
}
这一题= =没有想出状态,没有想出方程= =全程看题解===还看了3天--55555
第一天:读懂了题目==木有思路
第二天:继续不懂==
第三天:看题解= =懂一丢丢= =
大概一道题目,一时不会,放着慢慢来,每天看一看,可能就会好一些 加油加油---go---go---
HDU 1158 Employment Planning【DP】的更多相关文章
- HDU 1158 Employment Planning (DP)
		题目链接 题意 : n个月,每个月都至少需要mon[i]个人来工作,然后每次雇佣工人需要给一部分钱,每个人每个月还要给工资,如果解雇人还需要给一笔钱,所以问你主管应该怎么雇佣或解雇工人才能使总花销最小 ... 
- hdu 1158 Employment Planning(DP)
		题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ... 
- Hdu 1158 Employment Planning(DP)
		Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1158 一道dp题,或许是我对dp的理解的还不够,看了题解才做出来,要加油了. 只能先上代码了 ... 
- HDU - 1176   免费馅饼  【DP】
		题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路 因为刚开始的起点是固定的 但是终点不是固定的 所以我们可以从终点往起点推 dp[i][j] ... 
- HDU 1158 Employment Planning
		又一次看题解. 万事开头难,我想DP也是这样的. 呵呵,不过还是有进步的. 比如说我一开始也是打算用dp[i][j]表示第i个月份雇j个员工的最低花费,不过后面的思路就完全错了.. 不过这里还有个问题 ... 
- 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* ... 
- HDU - 1003 Max Sum 【DP】
		题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1003 题意 给出一个序列 要求找出一个和最大的子序列 思路 O(N)的做法 但是要标记 子序列的头部位 ... 
- hdu 5375 Gray code 【 dp 】
		dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ... 
- HDU 5234  Happy birthday【DP】
		题意:给出n*m的格子,每个格子的值为w[i][j],在值不超过k的时候,可以往右或者往下走,问从(1,1)走到(n,m)能够得到的最大的值 类似于背包 d[i][j][k]=maxx(d[i-1][ ... 
随机推荐
- Android fill_parent、wrap_content和match_parent的区别
			三个属性都用来适应视图的水平或垂直大小,一个以视图的内容或尺寸为基础的布局比精确地指定视图范围更加方便. 1)fill_parent 设置一个构件的布局为fill_parent将强制性地使构件扩展,以 ... 
- 如何开发一个自己的 RubyGem?
			「如何测试你的 RubyGem?」的前导文章 什么是 RubyGem RubyGem 是 Ruby 语言的标准源码打包格式. 大家一直都在用gem这个命令,但是很少有人知道这个东西是怎么来的,这里我从 ... 
- 2015年4月 15款免费jQuery插件
			点这里 We have collected for you the 15 fresh, free and handy jQuery plugins that will help to speed up ... 
- POJ 1969
			#include <iostream> #include <cmath> using namespace std; int main() { //freopen("a ... 
- [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题
			发布日期:2009.12.29 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码 ... 
- poj 2480 Longge's problem 积性函数
			思路:首先给出几个结论: 1.gcd(a,b)是积性函数: 2.积性函数的和仍然是积性函数: 3.phi(a^b)=a^b-a^(b-1); 记 f(n)=∑gcd(i,n),n=p1^e1*p2^e ... 
- Linux多线程之同步3
			需求 客户端将需要解决的task发送给服务器,服务器调用线程来解决客户端发送的task,解决完由线程负责将其发送回客户端.(用管道实现通信) 思路 1. server维护两个列表.一是客户端列表.二是 ... 
- 【XJOI-NOIP16提高模拟训练9】题解。
			http://www.hzxjhs.com:83/contest/55 说实话这次比赛真的很水..然而我只拿了140分,面壁反思. 第一题: 发现数位和sum最大就是9*18,k最大1000,那么su ... 
- hdu 1124 Factorial(数论)
			题意: 求n!的尾0的个数 分析: 0一定是由因子2和5相乘产生的: 2的个数显然大于5的个数,故只需统计因子5的个数 n/5不能完全表示n!中5的个数(egg: 25),应该n/=5后,累加上n/2 ... 
- PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法
			PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法 PHP5.3 split() 不建议使用的原因:PHP 5.3.0 之后的r ... 
