Employment Planning
有n个月,每个月有一个最小需要的工人数量\(a_i\),雇佣一个工人的费用为\(h\),开除一个工人的费用为\(f\),薪水为\(s\),询问满足这n个月正常工作的最小费用,\(n\leq 12\)。
解
显然可以猜一个结论,因为工人数不确定,猜测每一个月的工人数量必然为某一个月的工人的最小数量,于是可以设\(f[i][j]\)表示前i个月,拥有工人数量\(b_j\)的最小费用,其中\(b\)为\(a\)的离散化数组,因此有
\(f[i][j]=min(min_{k=0}^jf[i-1][k]+(b_j-b_k)\times h,min_{k=j+1}^nf[i-1][k]+(b_k-b_j)\times f)+s\times j\)
这个dp是\(O(n^3)\)的,但是使用单调队列可以优化到\(O(n^2)\),但数据范围没必要。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define il inline
#define ri register
#define Size 50
using namespace std;
int a[Size],b[Size],dp[Size][Size];
int main(){
	int n,h,s,f;
	while(scanf("%d",&n),n){
		scanf("%d%d%d",&h,&s,&f);
		for(int i(1);i<=n;++i)scanf("%d",&a[i]),b[i]=a[i];
		sort(b+1,b+n+1),memset(dp,0x3f,sizeof(dp)),dp[0][0]=0;
		for(int i(1),j,k;i<=n;++i)
			for(j=0;j<=n;++j)
				if(b[j]>=a[i]){
					for(k=0;k<=j;++k)
						dp[i][j]=min(dp[i][j],dp[i-1][k]+(b[j]-b[k])*h+s*b[j]);
					for(k=j+1;k<=n;++k)
						dp[i][j]=min(dp[i][j],dp[i-1][k]+(b[k]-b[j])*f+s*b[j]);
				}int ans(0x3f3f3f3f);
		for(int i(0);i<=n;++i)
			ans=min(ans,dp[n][i]);
		printf("%d\n",ans);
	}
	return 0;
}
												
											Employment Planning的更多相关文章
- Employment Planning[HDU1158]
		
Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
 - Employment Planning DP
		
Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
 - hdu1158 Employment Planning                                                                                            2016-09-11 15:14             33人阅读              评论(0)              收藏
		
Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
 - hdu 1158 dp Employment Planning
		
Employment Planning Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
 - hdu1158 Employment Planning(dp)
		
题目传送门 Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
 - HDU1158:Employment Planning(暴力DP)
		
Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
 - HDU 1158 Employment Planning
		
又一次看题解. 万事开头难,我想DP也是这样的. 呵呵,不过还是有进步的. 比如说我一开始也是打算用dp[i][j]表示第i个月份雇j个员工的最低花费,不过后面的思路就完全错了.. 不过这里还有个问题 ...
 - HDU 1158 Employment Planning【DP】
		
题意:给出n个月,雇佣一个人所需的钱hire,一个人工作一个月所需要的钱salary,解雇一个人所需要的钱fire,再给出这n个月每月1至少有num[i]个人完成工作,问完成整个工作所花费的最少的钱是 ...
 - HDU 1158 Employment Planning (DP)
		
题目链接 题意 : n个月,每个月都至少需要mon[i]个人来工作,然后每次雇佣工人需要给一部分钱,每个人每个月还要给工资,如果解雇人还需要给一笔钱,所以问你主管应该怎么雇佣或解雇工人才能使总花销最小 ...
 
随机推荐
- 【串线篇】Mybatis入门
			
MyBatis是持久化层框架(SQL映射框架)-操作数据库 一.环境搭建 1).创建一个java工程,java工程就行: 2). 创建表:自己用工具创建 创建javaBean:Employee(封装表 ...
 - 07.interrupt
			
/** *isInterrupted */ public class InterruptDemo { public static void main(String[] args) throws Int ...
 - oracle 中||
			
oracle里双竖线是字符串连接运算符!
 - 【leetcode】835. Image Overlap
			
题目如下: 解题思路:抛开移动的过程只看移动完成的结果,记图片左上角为顶点,正方形边长为board,要使得两个图片要有重叠,那么一定其中一张图片的顶点和另外一张图片的某一个点重合.假设图片A的顶点A( ...
 - easyUi-datagrid  真分页 +  工具栏添加控件
			
1. 新建Pager.js /** * * @param {any} el 元素 */ function showDataGrid1(el) { $(el).datagrid({ title: '分 ...
 - 如何在cmd中启动MongoDB服务器和客户端
			
1 先将MongoDB的bin路径添加到环境变量中 2 打开cmd输入mongod 开启MongoDB服务器 3 输入mongo开启MongoDB客户端
 - c#如何写服务,打包和卸载服务
			
Service.cs 每隔一分钟进行一次数据操作 public Service1() { InitializeComponent(); Sy ...
 - AcWing 231. 天码    (容斥)打卡
			
题目:https://www.acwing.com/problem/content/233/ 题意:给你n个不同的数,让你选取一个四元组,gcd为1,让你求这样的四元组数量是多少 思路:我们单独直接去 ...
 - JDK各个版本比较
			
JDK5 自动装箱与拆箱: 枚举 静态导入,如:import staticjava.lang.System.out 可变参数(Varargs) 内省(Introspector) 主要用于操作JavaB ...
 - 汇编学习(1)——win7 64位调出debug
			
一.安装方法: 1.下载一个dosbox和win7 32位debug.exe,安装dosbox,打开页面 2. 将debug.exe放入磁盘根目录,这里以D盘为例.在dosbox中输入mount ...