传送门

思路:

最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价。

那么转移方程就有:

\[dp(i,j)=min\{dp(k,j-1)+(sumT_i+S*j)*(sumC_i-sumC_k)\}
\]

为什么有个\(S*j\)呢,因为前面的批次启动会对后面的答案有影响。

但是分析复杂度是\(O(n^3)\)的,肯定不行。

考虑一下为什么需要第二个状态呢?是为了消除后效性,因为后面的状态不知道总共启动了几次。

但我们可以把费用提前计算,一次启动,那么对于后面所有的机器都会有贡献,我们提前把这个贡献算了,后面就可以不管这个了,也就是强制消除后效性

所以变换后的\(dp\)式子就为:

\[dp(i)=min\{dp(j)+sumT_i*(sumC_i-sumC_j)+S*(sumC_n-sum_j)\}
\]

其实这样已经可以通过洛谷的数据了,但这还不够!我们还可以优化。

观察\(dp\)式子,后面加上的部分为\(i,j\)相关变量的乘积形式,所以我们可以考虑斜率优化dp。

将\(i,j\)变量分离,有:

\[dp(j)=(s+sumT_i)*sumC_j+dp_i-sumT_i*sumC_i-s*sumC_n
\]

显然这个式子直接用队列维护一个斜率不断增加的下凸壳即可。

时间复杂度就为\(O(n)\)了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5005, MOD = 1e9 + 7;
int n, s;
int sumt[N], sumc[N];
int q[N], dp[N];
int main() {
#ifdef heyuhhh
freopen("input.in", "r", stdin);
#else
ios::sync_with_stdio(false); cin.tie(0);
#endif
cin >> n >> s;
for(int i = 1; i <= n; i++) {
int t, c; cin >> t >> c;
sumt[i] = sumt[i - 1] + t;
sumc[i] = sumc[i - 1] + c;
}
int l = 1, r = 1; q[1] = 0;
for(int i = 1; i <= n; i++) {
while(l < r && dp[q[l + 1]] - dp[q[l]] <= (s + sumt[i]) * (sumc[q[l + 1]] - sumc[q[l]])) ++l;
dp[i] = dp[q[l]] - sumt[i] * sumc[q[l]] - s * sumc[q[l]] + sumt[i] * sumc[i] + s * sumc[n];
while(l < r && (dp[i] - dp[q[r]]) * (sumc[q[r]] - sumc[q[r - 1]]) <= (dp[q[r]] - dp[q[r - 1]]) * (sumc[i] - sumc[q[r]])) --r;
q[++r] = i;
}
cout << dp[n];
return 0;
}

最新文章

  1. 104-switch语句读法:
  2. 一起来学习DOJO吧--序
  3. Hive自定义函数的学习笔记(1)
  4. guzzle调用失败-缺少guzzle
  5. 使用office添加文章目录
  6. Azure PowerShell (1) PowerShell整理
  7. 第九章:四大组件之Broadcast Receiver
  8. JavaScript 导出Excel 代码
  9. 翻译 - NodeJS错误处理最佳实践
  10. many-to-one和one-to-many的配置比较
  11. ARM的STRB和LDRB指令分析
  12. 自己写的一个banner动画
  13. Aix_bugzilla
  14. JDBC连接数据库概述
  15. OCP读书笔记(8) - 监控和调优RMAN
  16. Web API 路由 [一] Convention-Based Routing
  17. css 半圆效果
  18. vs+qt 运行过程出现cannot run rc.exe
  19. Fragment分解使用
  20. L266 作文

热门文章

  1. [LeetCode] 37. Sudoku Solver 求解数独
  2. Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法
  3. 【递归】执行过程探究(c)
  4. k8s学习路线
  5. 基于 Docker 实现 DevOps 的一些探索
  6. pytorch_05_神经网络
  7. go-gin-api 路由中间件 - 签名验证(七)
  8. POJ 3132 DP+素数筛
  9. golang 学习笔记 ---JSON
  10. 《 .NET并发编程实战》阅读指南 - 第6章