又一次看题解。

万事开头难,我想DP也是这样的。

呵呵,不过还是有进步的。

比如说我一开始也是打算用dp[i][j]表示第i个月份雇j个员工的最低花费,不过后面的思路就完全错了。。

不过这里还有个问题,这样开数组j开多大比较好,难道要我开2^31-1这么大?

题解里面开了1000多,也许再小一点也能过吧。

因为有可能解雇一个人的花费比较大,所以某个月可能继续雇佣他这样总的算来是最省的。

所以第i个月可能雇佣的人数是从num[i] ~ NumMax。

首先对第一个月的费用初始化,就是(雇佣+薪水)×人数。

后面便是核心代码,

 if(j < num[i - ])
dp[i][j] = dp[i - ][num[i - ]] + salary * j + (num[i - ] - j) * fire;
else
dp[i][j] = dp[i - ][num[i - ]] + salary * j + (j - num[i - ]) * hire;

这一句是为了后面的状态转移做准备,

先假设在上个月恰好雇num[i - 1]人的最小费用的基础上,人数多了就解雇,少了就雇佣是最省的。

然后再增加一个循环变量k,假如上个月多雇了一个人,那么这个月不用解雇也许可能更省。

 for(int k = num[i - ] + ; k <= NumMax; ++k)
{
if(k > j)
dp[i][j] = min(dp[i][j], dp[i - ][k] + j * salary + (k - j) * fire);
else
dp[i][j] = min(dp[i][j], dp[i - ][k] + j * salary + (j - k) * hire);
}

最后就是输出最优解了,最优解有可能在数组最后一行的任何一个地方(还是那句话,假如上个月多雇了一个人,那么这个月不用解雇也许可能更省。)

所以要找到最后一行的最小值来输出。

总结:

注意:千万不要的在心情不平稳的时候敲代码,这样只会越敲越乱,与其去改还不如心平气和的从头开始敲,好有个完整的思路。

刚才9点多在教室里是时候因为要快熄灯了,而且这一天就在搞这一道题,还没完全弄明白。便有些心急,想着今天怎么也要把这道题

A出来。结果回宿舍改的时候各种错误,变量名打错,不等号搞反之类的。

不管是做题还是敲代码,平心静气,切记切记!

完整的AC代码:

 #define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int dp[][];
int num[]; int main(void)
{
#ifdef LOCAL
freopen("1158in.txt", "r", stdin);
#endif int n;
while(scanf("%d", &n) && n)
{
int i;
int fire, salary, hire;
int NumMax = ;
scanf("%d %d %d", &hire, &salary, &fire); for(i = ; i < n; ++i)
{
scanf("%d", &num[i]);
if(NumMax < num[i])
NumMax = num[i];
}
if(NumMax == )
{
printf("0\n");
continue;
}
for(i = num[]; i <= NumMax; ++i)
dp[][i] = i * (hire + salary); for(i = ; i < n; ++i)
{
for(int j = num[i]; j <= NumMax; ++j)
{
if(j < num[i - ])
dp[i][j] = dp[i - ][num[i - ]] + salary * j + (num[i - ] - j) * fire;
else
dp[i][j] = dp[i - ][num[i - ]] + salary * j + (j - num[i - ]) * hire; //考虑到与其解雇一个人还不如让他继续待下去的情况
for(int k = num[i - ] + ; k <= NumMax; ++k)
{
if(k > j)
dp[i][j] = min(dp[i][j], dp[i - ][k] + j * salary + (k - j) * fire);
else
dp[i][j] = min(dp[i][j], dp[i - ][k] + j * salary + (j - k) * hire);
}
}
} int ans = ;
for(i = num[i - ]; i <= NumMax; ++i)
ans = min(dp[n - ][i], ans);
printf("%d\n", ans);
}
return ;
}

代码君

HDU 1158 Employment Planning的更多相关文章

  1. HDU 1158 Employment Planning (DP)

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

  2. Hdu 1158 Employment Planning(DP)

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

  3. HDU 1158 Employment Planning【DP】

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

  4. hdu 1158 Employment Planning(DP)

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

  5. 【HDOJ】1158 Employment Planning

    简单DP. #include <cstdio> #include <cstring> #include <cstdlib> #include <climits ...

  6. HDU 1158(非常好的锻炼DP思维的题目,非常经典)

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=1158 Employment Planning Time Limit: 2000/1000 MS (Java/Oth ...

  7. hdu 1158 dp Employment Planning

    Employment Planning Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  8. Employment Planning[HDU1158]

    Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  9. Employment Planning DP

    Employment Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

随机推荐

  1. 简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera

    一.跨浏览器的网页设计一直是让人很头疼的问题,这不只是因为浏览器的版本众多,还有一个重要的原因是相同浏览器的不同时期的版本也会有差异,甚至是在不同操作同台上还会有不同.因此使CSS hack技术进行浏 ...

  2. 在linux服务器上装svn版本管理,自动部署代码到项目

    在linux服务器上装svn版本管理,自动部署代码到项目 http://bbs.aliyun.com/read/9715.html?spm=5176.7114037.1996646101.1.W3zw ...

  3. POJ 2014

    #include <iostream> using namespace std; int main() { //freopen("acm.acm","r&qu ...

  4. 使用Visio进行UML建模

    http://www.qdgw.edu.cn/zhuantiweb/jpkc/2009/rjkf/xmwd/Visio_UmlModel.htm#_Toc80417837 内容提纲: 1.VISIO中 ...

  5. 《JavaScript基础教程(第8版)》PDF

    简介:JavaScript基础教程(第8版)循序渐进地讲述了JavaScript及相关的CSS.DOM.Ajax.jQuery等技术.书中从JavaScript语言基础开始,分别讨论了图像.框架.浏览 ...

  6. strrchr函数

    C语言函数 函数简介 函数名称: strrchr 函数原型:char *strrchr(char *str, char c); 所属库: string.h 函数功能:查找一个字符c在另一个字符串str ...

  7. UVA 10780 Again Prime? No Time. 分解质因子

    The problem statement is very easy. Given a number n you have to determine the largest power of m,no ...

  8. 浅析dex文件加载机制

    我们可以利用DexClassLoader来实现动态加载dex文件,而很多资料也只是对于DexClassLoader的使用进行了介绍,没有深入讲解dex的动态加载机制,我们就借助于Android4.4的 ...

  9. Struts2.0 去掉action后缀名

    刚刚接触Struts2.0,发现默认请求都会带着后缀名:action 就如下图,url地址中会暴露login.action(请原谅struts拼写错误..) 作为一个URL简洁爱(chu)好(nv)者 ...

  10. ArchLinux安装与配置小结

    最近无意间发现一个基于ArchLinux的发行版--BlackArch,主题十分炫酷(中二).当然渗透类的Linux 发行版已经有BackTrack和Kali了,不过都是源于Debian的,使用者众多 ...