最开始,笔者将状态 fif_{i}fi​ 定义为1到i的最小花费 ,我们不难得到这样的一个状态转移方程,即

fi=(sumti−sumtj+S+Costj)∗(sumfi−sumfj)f_{i}=(sumt_{i}-sumt_{j}+S+Cost_{j})*(sumf_{i}-sumf_{j})fi​=(sumti​−sumtj​+S+Costj​)∗(sumfi​−sumfj​) 。

可是我们发现这时 CostjCost_{j}Costj​ 非常不好算,而且当前的决策还会对后面的决策产生影响,而且这个转移方程是明显不具备最优子结构的(想一想, 为什么?)。
那么,我们就换一个思路,将 fif_{i}fi​ 重新定义,我们可将 fif_{i}fi​ 定义为

fi=min(fj+(sumfi−sumfj)∗(sumti−sumtj+S)+(sumti−sumtj+S)∗(sumfn−sumfi))f_{i}=min(f_{j}+(sumf_{i}-sumf_{j})*(sumt_{i}-sumt_{j}+S)+(sumt_{i}-sumt_{j}+S)*(sumf_{n}-sumf_{i}))fi​=min(fj​+(sumfi​−sumfj​)∗(sumti​−sumtj​+S)+(sumti​−sumtj​+S)∗(sumfn​−sumfi​))

即我们定义的 fif_{i}fi​ 还考虑了对后面的贡献,这样就可以愉快的进行dp了。
时间复杂度是 O(n2)O(n^2)O(n2) ,其实我们还可以用斜率优化将其优化到 O(n)O(n)O(n) ,不过方法不难,笔者就不再阐述。
Code:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 5002;
const long long inf = 10000000000 + 3;
long long sumf[maxn], sumt[maxn], f[maxn];
int main()
{
int n, s;
scanf("%d%d",&n,&s);
for(int i = 1;i <= n;++i)
{
scanf("%d%d",&sumt[i], &sumf[i]);
sumt[i] += sumt[i - 1], sumf[i] += sumf[i - 1];
}
for(int i = 1;i <= n; ++i)
{
f[i] = inf;
for(int j = 0;j < i; ++j)
f[i] = min(f[i], f[j] + (sumf[i] - sumf[j]) * (sumt[i] - sumt[j] + s) + (sumt[i] - sumt[j] + s) * (sumf[n] - sumf[i]));
}
printf("%lld",f[n]);
return 0;
}

  

洛谷 P2365 任务安排_代价提前计算 + 好题的更多相关文章

  1. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  2. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

  3. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  4. 洛谷P2365 任务安排 [解法二 斜率优化]

    解法一:http://www.cnblogs.com/SilverNebula/p/5926253.html 解法二:斜率优化 在解法一中有这样的方程:dp[i]=min(dp[i],dp[j]+(s ...

  5. 洛谷P2365 任务安排 [解法一]

    题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...

  6. 洛谷P1220关路灯[区间DP 提前计算代价]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  7. [洛谷 P2365] 任务安排 (线性dp)

    3月14日第二题!! 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  8. 洛谷 P2365 任务安排【dp】

    其实是可以斜率优化的但是没啥必要 设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费 然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时 ...

  9. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

随机推荐

  1. logistic regression model

    logistic regression model LR softmax classification Fly logistic regression model loss fuction softm ...

  2. 在Map对象中获取属性,注意判断为空

    在Map对象中获取属性,注意判断为空 public static void main(String[] args) { Map map = new HashMap(); Integer i = (In ...

  3. Swift学习——类的定义,使用,继承,构造等(五)

    Swift学习--类的定义,使用.继承,构造等(五) 类的使用说明 1 使用class和类名来创建一个类名,比如: class student 2 类中属性的声明和常量和变量一样,唯一的差别就是他们的 ...

  4. HDU 5291(Candy Distribution-差值dp)

    Candy Distribution Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. tensorflow利用预训练模型进行目标检测(四):检测中的精度问题以及evaluation

    一.tensorflow提供的evaluation Inference and evaluation on the Open Images dataset:https://github.com/ten ...

  6. ijkplayer详解AAA

    https://www.jianshu.com/p/c5d972ab0309 https://www.android-arsenal.com/details/1/530 https://stackov ...

  7. Android.mk宏定义demo【转】

    本文转载自:http://blog.csdn.net/u010164190/article/details/72783963 1.Android.mk  LOCAL_PATH := $(call my ...

  8. B1968 [Ahoi2005]COMMON 约数研究 数论

    大水题,一分钟就做完了...直接枚举1~n就行了,然后在n中判断出现多少次. 题干: Description Input 只有一行一个整数 N(0 < N < 1000000). Outp ...

  9. Node.js:安装配置

    ylbtech-Node.js:安装配置 1.返回顶部 1. ode.js 安装配置 本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v4.4 ...

  10. MongoDB实现数组中重复数据删除

    这个功能真的是写死我了,对于MongoDB一点都不熟悉,本来想使用spring与MongoDB的融合mongoDBTemplate,发现压根不是web项目,懒得配置那些配置文件,就使用最原始的数据库操 ...