hdu1158【DP】
题意:
第一行项目数;
第二行每个工人的Hire
Salary Fire money
第三行每个项目需要的人的数量;
工人在hire/fire的时候要付出额外的钱,如果已经hire了还没有fire就一直会付salary求一个最小开支。
思路:
这题因为感觉就是DP,所以也没想贪心。。
H:hire的钱
S:salary
F:firep[]代表项目人数;
首先可以看出:
①:p[i-1]<p[i]
:要再雇几个人,前一状态+H*(p[i]-p[i-1])+S*p[i]
②:p[i-1]==p[i]
:直接就是 前一状态+S*p[i]
③:p[i-1]>p[i]
:要先去几个人,前一状态+F*(p[i]-p[i-1])+S*p[i]
用dp[i][j]代表前i个项目的j个人的消费;
从前一状态到后一状态的改变:我们可以想到最多最多雇的人不会超过期间最多的人;
所以对于每次状态的更新都要更新到最多人次,而每次人次的下界,并不是最小,因为对于第i个项目你最小要拿p[i]个人,所以每次状态的更新是从p[i]到会出现的最多人次;
然后转移过来的值,就是在之前的状态经过转换后的一个最小值,而前一状态有:dp[i-1][j],p[i-1]<=j<=tmax(某项目最多人)
那么初始化,状态转移就不难了~
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=12+10;
const int INF=0x3f3f3f3f; int p[N];
int dp[N][1010];
int H;
int S;
int F;
int n; int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
scanf("%d%d%d",&H,&S,&F);
scanf("%d",&p[1]);
int tmax=p[1];
for(int i=2;i<=n;i++)
{
scanf("%d",&p[i]);
tmax=max(p[i],tmax);
}
memset(dp,0,sizeof(dp)); for(int i=p[1];i<=tmax;i++)
dp[1][i]=i*S+i*H; int temp;
for(int i=2;i<=n;i++)
{
for(int j=p[i];j<=tmax;j++)//对于第i次的更新;
{
temp=INF;
for(int k=p[i-1];k<=tmax;k++)//从前一状态拿一个最小值;
if(temp>dp[i-1][k]+(j>=k?(j*S+(j-k)*H):(j*S+(k-j)*F)))
temp=dp[i-1][k]+(j>=k?(j*S+(j-k)*H):(j*S+(k-j)*F));
dp[i][j]=temp;
}
}
int ans=dp[n][p[n]];
for(int i=p[n]+1;i<=tmax;i++)
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}
hdu1158【DP】的更多相关文章
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- libcurl理解和使用
1 libcurl是一个很好的客户端库 2 CURLOPT_URL 就是普通的url. 3 CURLOPT_HTTPHEADER 3.1 http get 4 CURLOPT_WRITEFUNCTIO ...
- ALTER USER USER() IDENTIFIED BY 'password';
[root@test mysql]# bin/mysqld 2018-08-04T14:09:33.831318Z 0 [Warning] [MY-011070] [Server] 'Disablin ...
- Kotlin基本语法笔记3之定义类、继承及创建实例
定义类 class MyObject private constructor(name: String, age: Int) { private var name: String private va ...
- mysql给一张表新增字段,并设置该字段为外键
首先给usercategory表新增libraryid字段: alter table usercategory add libraryid varchar(50) 修改picturelibrary表的 ...
- 用ASTERISK搭建自己的免费VOIP服务器
服务器别闲着,博主又要给大家带来新的玩法咯 1. 这里以 Debian 为例子,安装 Asterisk apt-get update apt-get install asterisk 2. 预设置 A ...
- SpringSecurity加密Salt
Spring Security 加密,默认加salt的输出为:password{salt};然后再对这个加salt后的密码加密存储. 源码如下: protected String mergePassw ...
- animation steps属性实现帧动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta na ...
- 安装python解释器
Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,在Windows系统上需要安装一下,超简单 打开官网 https://www.python.org/d ...
- hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 让人头疼一晚上的 select 下拉框赋值问题
一开始做这个功能 批量修改用户组 , 当勾选若干用户组后, 点击[批量修改用户组]->ajax提交后台查询->返回下拉菜单列表内容-> 弹出对话框并赋予下拉菜单select 动态数值 ...