博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1158:Employment Planning(线性dp)
阅读量:5882 次
发布时间:2019-06-19

本文共 1058 字,大约阅读时间需要 3 分钟。

题目:

这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一个人需要花费m2的钱,然后给出n的数字,

代表每月需要的最少员工,问如何进行人员调整使最终花费的钱最少。

我已开始就推错了状态转移方程,因为给出的是最少的员工,所以要从当前最少员工~最多员工枚举。

还有每次需要比较num[i-1]与num[i]的大小,具体实现请看代码。

#include 
#include
#include
#include
#define inf 0x3f3f3f3f using namespace std; int n,dp[13][110]; int m1,sa,m2,num[13],maxx; int main() { while(scanf("%d",&n)!=EOF&&n!=0) { scanf("%d%d%d",&m1,&sa,&m2); maxx=-inf; for(int i=1; i<=n; i++) { scanf("%d",&num[i]); maxx=max(maxx,num[i]); } for(int i=0;i<=n;i++) { for(int j=0;j<=maxx;j++) dp[i][j]=inf; } for(int i=1;i<=maxx;i++) { dp[1][i]=i*m1+i*sa; //printf("dp[1][%d]==%d\n",i,dp[1][i]); } for(int i=2;i<=n;i++) { for(int j=num[i];j<=maxx;j++) { for(int k=num[i-1];k<=maxx;k++) { if(k>=j) dp[i][j]=min(dp[i][j],dp[i-1][k]+(k-j)*m2+j*sa); else dp[i][j]=min(dp[i][j],dp[i-1][k]+(j-k)*m1+j*sa); } //printf("dp[%d][%d]==%d\n",i,j,dp[i][j]); } } int minx=inf; for(int i=num[n];i<=maxx;i++) minx=min(minx,dp[n][i]); printf("%d\n",minx); } return 0; }

 

 

转载地址:http://yzpix.baihongyu.com/

你可能感兴趣的文章
raid技术-研究感受
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>
U盘启动盘制作工具箱 v1.0
查看>>