题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158

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

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

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

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

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#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;
}

最新文章

  1. ios 自定义键盘
  2. c++中的指针之指针在数组
  3. MVC View中获取Url参数的值
  4. 干货:Web应用上线之前程序员应该了解的技术细节
  5. 关于 Lua 内存泄漏的检测
  6. SRM 387(1-250pt)
  7. C#中通过位运算实现多个状态的判断
  8. Beauty of Array(思维)
  9. 采用ACE登录设施(一)HelloWorld
  10. android账号与同步之发起同步
  11. 通过配置的方式Autofac(1)
  12. JSONArray用法jquery循环list&lt;Map&gt;对象
  13. base64码转图片
  14. 【学习笔记】 使用XML配置和注解实现Spring的依赖注入DI (2-3-2)
  15. Oracle闪回技术
  16. jdk源码阅读笔记-Integer
  17. Storm实现实时大数据分析(storm介绍,与Hadoop比较,)
  18. 汇编语言--微机CPU的指令系统(五)(移位操作指令)
  19. 填一个laravel视图缓存没有及时更新的坑
  20. 模拟curl函数

热门文章

  1. Unix系统编程(六)write系统调用
  2. Netty4.x中文教程系列(六) 从头开始Bootstrap
  3. @override 报错问题
  4. Java泛型小结
  5. ARM与X86架构的对决[整编]
  6. 加速I/O的基本规则
  7. 2018 ACM ICPC 南京赛区 酱油记
  8. ubuntu 自动清理/tmp目录
  9. Java序列化(转载)
  10. 微软2016校园招聘4月在线笔试 hihocoder 1289 403 Forbidden