hdu 1158-Employment Planning,n*n*n
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1158
解题思路就不多说,动态规划。
值得提及的是题目没有给出数据范围,水过的都默认工人数目不超过1000。
我给出了n*n*n的算法,针对工人数目任意的情况。
首先,可以判断的是,每次决策之后的工人数量,肯定和从当前月开始的之后某个月的工人数量相同
如要hire,则当hire足够;如要fire,则当fire到底;
如此就可以应离散化的方法了,n*n*n。转移为o(n)
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
using namespace std; #define N 15
int dp[N][N];
int hire,sala,fire;
int num[N];
int disf[N];
int pos[N];
int main()
{
int i,j,k,n,tmp;
while(~scanf("%d",&n) && n)
{
scanf("%d%d%d",&hire,&sala,&fire);
for(i=0;i<n;disf[i]=num[i],i++)scanf("%d",&num[i]);
sort(disf,disf+n);
for(i=0;i<n;pos[i]=j,i++)for(j=0;j<n && num[i]!=disf[j];j++);
memset(dp,-1,sizeof(dp));
dp[0][pos[0]]=(hire+sala)*num[0]; for(i=1;i<n;i++)
for(k=pos[i];k<n;k++){ for(j=pos[i-1];j<n;j++)
if(dp[i-1][j]!=-1){
if(j<k)tmp=dp[i-1][j]+(disf[k]-disf[j])*hire+disf[k]*sala;
else tmp=dp[i-1][j]+(disf[j]-disf[k])*fire+disf[k]*sala; if(dp[i][k]==-1)dp[i][k]=tmp;
else dp[i][k]=min(dp[i][k],tmp);
} }
/*
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",dp[i][j]);
printf("\n");
}
*/
int minp=dp[n-1][pos[n-1]];
for(j=pos[n-1]+1;j<n;j++)
minp=min(minp,dp[n-1][j]);
printf("%d\n",minp);
}
return 0;
}
/*
3
4 5 6
10 9 11 */
hdu 1158-Employment Planning,n*n*n的更多相关文章
- HDU 1158 Employment Planning (DP)
题目链接 题意 : n个月,每个月都至少需要mon[i]个人来工作,然后每次雇佣工人需要给一部分钱,每个人每个月还要给工资,如果解雇人还需要给一笔钱,所以问你主管应该怎么雇佣或解雇工人才能使总花销最小 ...
- Hdu 1158 Employment Planning(DP)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1158 一道dp题,或许是我对dp的理解的还不够,看了题解才做出来,要加油了. 只能先上代码了 ...
- 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个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...
- 【HDOJ】1158 Employment Planning
简单DP. #include <cstdio> #include <cstring> #include <cstdlib> #include <climits ...
- HDU 1158(非常好的锻炼DP思维的题目,非常经典)
题目链接: acm.hdu.edu.cn/showproblem.php?pid=1158 Employment Planning Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 1158 dp Employment Planning
Employment Planning Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- 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 ...
随机推荐
- vue-music 关于搜索历史本地存储
搜索历史 搜索过的关键词 保存在本地存储 localstorage 中,同时多个组件共享搜索历史数据,将数据存到vuex 中,初始值从本地缓存中取得对应key 的值,没有数据默认为空数组 点击搜索关键 ...
- Mysql 主键约束PrimaryKey
Mysql 主键约束Primary Key 今天来简单的讲一下主键约束. 假如有一张学生信息表,里面记录了学生的学号 ,姓名,成绩等,那么,会不会有两个学号相同的学生,答案肯定是否定的,如果有的话也只 ...
- 洛谷P1404 平均数 [01分数规划,二分答案]
题目传送门 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...
- Python之路【第六篇】:模块与包
目录 一 模块 3.1 import 3.2 from ... import... 3.3 把模块当做脚本执行 3.4 模块搜索路径 3.5 编译python文件 3.6 标准模块 3.7 dir ...
- linux——(5)文件与文件系统的压缩与打包
概念一:常见的压缩文件拓展名 .z compress程序压缩的文件. .gz gzip程序压缩的文件. .bz2 bzip2程序压缩的文件. .tar tar程序打包的数据,并没有压缩过. .tar. ...
- CentOS下Supervisor的安装与使用入门
[转载]http://www.51bbo.com/archives/2120 Supervisor是一个进程管理工具,官方的说法 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原 ...
- cinder 挂载卷和 iSCSI原理
LVM名称介绍 PV:物理磁盘 VG:卷组,多个PV可以组成一个VG,一个VG可以划分成多个LV(逻辑卷). PP:物理区块,将一个VG逻辑的划分成连续的小块. LP:逻辑区块,若干个PP组成一个LP ...
- pool创建多进程
这中方式用的比较多,毕竟要控制并发数量,不可能不限制并发数 #_*_coding:utf-8_*_ from multiprocessing import Pool import time def f ...
- shell中的cat和文件分界符(<<EOF) (转)
原文地址: http://blog.csdn.net/mosesmo1989/article/details/51123257 在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任 ...
- codevs 1226 倒水问题
1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x, ...