2018.07.09 洛谷P2365 任务安排(线性dp)
P2365 任务安排
题目描述
N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。
例如:S=1;T={1,3,4,2,1};F={3,2,3,3,4}。如果分组方案是{1,2}、{3}、{4,5},则完成时间分别为{5,5,10,14,14},费用C={15,10,30,42,56},总费用就是153。
输入输出格式
输入格式:
第一行是N(1<=N<=5000)。
第二行是S(0<=S<=50)。
下面N行每行有一对数,分别为Ti和Fi,均为不大于100的正整数,表示第i个任务单独完成所需的时间是Ti及其费用系数Fi。
输出格式:
一个数,最小的总费用。
输入输出样例
输入样例#1:
5
1
1 3
3 2
4 3
2 3
1 4
输出样例#1:
153
好吧又一道基础dp" role="presentation" style="position: relative;">dpdp,这题一看就是道水题。题中的s" role="presentation" style="position: relative;">ss在状态转移的时候有点烦,所以在状态转移的时候不如将s" role="presentation" style="position: relative;">ss的贡献和任务的时间和的贡献分开统计。然后来推推状态转移方程吧。
先令f[i]" role="presentation" style="position: relative;">f[i]f[i]完成前i" role="presentation" style="position: relative;">ii个任务所需的最少时间,并且我们在求f[i]" role="presentation" style="position: relative;">f[i]f[i]之前已经推出了f[1]…f[i−1]" role="presentation" style="position: relative;">f[1]…f[i−1]f[1]…f[i−1]的值,于是完成前i" role="presentation" style="position: relative;">ii个任务的方式就是先用之前求出的最优方式完成前j−1" role="presentation" style="position: relative;">j−1j−1个任务,然后将j…i" role="presentation" style="position: relative;">j…ij…i分成一批来处理。
接下来让我们用oi" role="presentation" style="position: relative;">oioi语言翻译上面一段话吧。当我们将j…i" role="presentation" style="position: relative;">j…ij…i分成一批来处理时,s" role="presentation" style="position: relative;">ss会对答案增加s∗j…n所有任务的费用之和" role="presentation" style="position: relative;">s∗j…n所有任务的费用之和s∗j…n所有任务的费用之和那么多的贡献,同样的,前i" role="presentation" style="position: relative;">ii个任务的完成时间会对答案增加前" role="presentation" style="position: relative;">前前i个任务的完成总时间∗j…i所有任务的费用之和" role="presentation" style="position: relative;">个任务的完成总时间∗j…i所有任务的费用之和个任务的完成总时间∗j…i所有任务的费用之和的贡献。所以状态转移方程就推出来了:
dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));" role="presentation" style="position: relative;">dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));,其中tim[i]" role="presentation" style="position: relative;">tim[i]tim[i]和w[i]" role="presentation" style="position: relative;">w[i]w[i]都表示前缀和。
代码如下:
#include<bits/stdc++.h>
#define N 5005
using namespace std;
int n,s,dp[N],tim[N],w[N];
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
int main(){
n=read(),s=read();
memset(dp,0x3f3f3f3f,sizeof(dp));
for(int i=1;i<=n;++i)tim[i]=tim[i-1]+read(),w[i]=w[i-1]+read();
dp[0]=0;
for(int i=1;i<=n;++i)for(int j=1;j<=i;++j)dp[i]=min(dp[i],dp[j-1]+s*(w[n]-w[j-1])+tim[i]*(w[i]-w[j-1]));
printf("%d",dp[n]);
return 0;
}
2018.07.09 洛谷P2365 任务安排(线性dp)的更多相关文章
- 洛谷 P2365 任务安排【dp】
其实是可以斜率优化的但是没啥必要 设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费 然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时 ...
- 2018.11.04 洛谷P2679 子串(线性dp)
传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- [洛谷P2365] 任务安排
洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- 洛谷P2365 任务安排(斜率优化dp)
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...
- 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)
传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...
- 2018.07.01 洛谷小B的询问(莫队)
P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...
随机推荐
- 常用Sql语句,及注意事项
目录: sql语句 sql命令语句 关键字 sql语句 SELECT * FROM V$reserved_words;--查询oracle预留关键字 SELECT * FROM V$version;- ...
- input 提交属性 hidden属性
name名字最好和你后台属性的成员变量对应,否则在参数传递的时候接收不到出现空指针异常.一般表单提交后input会以name的值=value的值的形式传给后台.如:<input type=&qu ...
- 程序员教程-11章-Java程序设计
自己是学java的,先看第十一章java吧. 列出章节目录,便于自己回忆内容. 11.1 Java语言概述 1 Java语言的特点 2 Java开发环境 11.2 Java语言基础 11.2.1 基本 ...
- keepalive配置与管理
什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ...
- 吴裕雄 python神经网络 水果图片识别(1)
import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...
- SpringCloud组件和概念介绍1
一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...
- java.lang.Error: Unresolved compilation problem: 解决方案
严重: Allocate exception for servlet WX_Interfacejava.lang.Error: Unresolved compilation problem: The ...
- mysql增加远程连接用户及查看数据库表结构
一.增加远程连接用户 1.用root权限登录数据库 2.加用户:grant all privileges on *.* to '111'@'192.168.1.%' identified by '2 ...
- Java的线程同步
synchronized获取的锁是对象,而不是函数或语句块. 项目结构 资源类 import java.util.concurrent.TimeUnit; public class myResourc ...
- HTML实例
HTML内容繁多,不易记忆,故将此网址 作为查阅复习的工具http://www.w3school.com.cn/example/html_examples.asp