HDU 1158 Employment Planning
又一次看题解。
万事开头难,我想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的更多相关文章
- 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】
题意:给出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[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 ...
随机推荐
- 100个经典的C算法
1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? #include<stdio.h&g ...
- 首次发布App,In-App Purchase 无法submit for review 问题的解决方案
原地址:http://blog.csdn.net/blucenong/article/details/7819195 一个IDP首次create app 然后首次create new IAP的时候,我 ...
- mysql存储过程和函数使用实例
1.需求:根据输入的年份,月份,和当前系统的年份比较,不满1年按1年计算,多出1年11个月也按1年计算. 2.计算得出来的使用年份,计算车辆残值. 3.存储过程 DELIMITER $$ USE `d ...
- jQuery对象和javascript对象互换
jquery变js var obj=$("dom"); 或 var obj=jQuery("dom"); js 变 jquery var $jobj=$(obj ...
- C#修改注册表设置默认浏览器
项目中用到VPN技术登录来访问内部网络的应用系统,VPN客户端连接后会自动以默认浏览器来打开站点,由于应用系统使用的前端框架对IE浏览器版本要求较高,而用户大多数的电脑里安装的IE的版本都较低,于是想 ...
- android自动化环境搭建
android自动化环境安装指南 1.appium相关安装(eclipse下)见http://www.cnblogs.com/wangcp-2014/p/5717589.html参考selenium的 ...
- 阿里巴巴fastJson进行json数据解析
1.生成JsonObject:将Java bean转换成易于处理和传输的strig的key value形式. 2.解析JsonObject:将收到的字符串转换成JsonObejct这种对象形式,Jso ...
- TestDirector域或工程用户的管理
一.添加用户 单击界面上的"Users"按钮,进入如下图: 我们可以添加新用户,删除用户,导入用户,修改用户密码,用户的详细信息. 1.单击"New"按钮为域或 ...
- 关于java中split的使用
之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊.题目大概是这样的: ) ...
- 对话框上右下角显示resize icon(可以拖动改变对话框的大小)(在WM_CREATE的时候,增加WS_THICKFRAME风格)
CStatusBar m_StatusBar; // 成员变量 // 全局变量 static UINT auIDStatusBar[] = { ID_SEPARATOR }; //在对话框类的WM_ ...