题目

解析

很容易想到的 \(dp\):

设 \(f_i\) 表示已经处理完 \(1..i\) 并且 \(i\) 是直接复制的需要的最小花费

那么 \(f_i=f_j+(i-j) \times (i-j-1)+c_i\)

这就是经典的斜率优化 \(dp\),一般我们考虑两个决策谁会更优

考虑 \(j,k\) 两个决策,那么我们可以列个不等式,把它化成只关于 \(j\) 的式子和只关于 \(k\) 的式子放一边,剩下的放一边

再写成斜率的形式,具体分析怎么维护

式子如下:

\[\frac{2f_j+j^2+j-2f_k-k^2-k}{2j-2k} < i
\]

小于号维护下凸壳,斜率和横坐标都单调增,可以用单调队列维护

\(Code\)

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL; const int N = 1e6 + 5;
const LL INF = 1e15;
int n;
LL f[N] , c[N] , q[N]; inline double slope(int x , int y)
{
return (2.0 * f[y] + 1.0 * y * y + y - (2.0 * f[x] + 1.0 * x * x + x)) / (2.0 * y - 2.0 * x);
}
int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%lld" , c + i);
int h = 1 , t = 1;
q[h] = 0;
for(register int i = 1; i <= n; i++)
{
while (h < t && slope(q[h] , q[h + 1]) < i) h++;
f[i] = f[q[h]] + (LL)(i - q[h]) * (i - q[h] - 1) / 2 + c[i];
while (t > h && slope(q[t - 1] , q[t]) > slope(q[t] , i)) t--;
q[++t] = i;
}
printf("%lld\n" , f[n]);
}

最新文章

  1. 【XLL 框架库函数】 TempActiveRow/TempActiveRow12
  2. 解决windows 2003 无法安装vss2005的问题
  3. Leetcode026. Remove Duplicates from Sorted Array
  4. Microsoft.Web.Administration in IIS
  5. PIMPL设计模式的理解和使用
  6. Session 转台服务器的使用方法
  7. bunoj 34990(hash)
  8. hdu1292(递推dp)
  9. let 和 var定义变量的区别-盼盼Degenerate
  10. jira7.3.6的安装步骤
  11. dijistra
  12. LeetCode算法题-Third Maximum Number(Java实现-四种解法)
  13. MyBatis-Helloworld
  14. net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用
  15. 【接口时序】7、VGA接口原理与Verilog实现
  16. Wordpress 更新时 不输入ftp相关信息的方法
  17. iOS 10跳转到其他app
  18. 基于TransactionScope类的分布式隐式事务
  19. MVC ---- 增删改成 EF6
  20. linux awk命令详解--转载

热门文章

  1. 除了 filter 还有什么置灰网站的方式?
  2. 2.9:数据交换-csv、Excel、json、爬虫、Tushare获取数据
  3. 深入理解 Python 的对象拷贝和内存布局
  4. 用Dockerfile制作一个java应用镜像,ubuntu基础篇
  5. .net core操作MongoDB
  6. [Unity]Unity更改黑色主题(个人版)
  7. 10.关于synchronized的一切,我都写在这里了
  8. 2023牛客寒假算法基础集训营1 ACDEFGHKLM
  9. 图文并茂记录下重新配置Win10系统Flutter环境--内含Android Studio 下载安装教程
  10. 集合框架-Collection集合