题意:

  给出一个序列 {a[i]} 把其分成若干个区间,每个区间的价值为 W = (j − i + ∑ak(i<=k<=j) - L)​,求所有分割方案中价值之和的最小值。

细节:

  仔细看数据范围:1 <= N <= 50000 ,1 <= C[i] <= 10^7,所以不忘记开Long Long / Int64,咳咳我很关心 Pascal 选手。

分析:

  显然一题划分区间求最值的题目,所以可以用动态规划解决,联想一下状态:f[i] 表示以 i 为结尾且以 i 为断点的最小价值和。

  考虑到 i 是断点的问题所以对于后面的状态,新的一段区间是不包括 i 的,所以我们可以开始转移了:f[i] = min { f[j] + (sum[i] - sum[j] + i - (j + 1) - L)2 }

  得到了一个 1D/1D 的动规方程,对于这一类式子我们一般考虑优化转移,显然状态无法进行优化,不然思想转变成了贪心,显然局部最有不满足全局最有,我们可以尝试是否存在在转移时的无用状态,所谓无用状态是一些不优的状态,我们显然可以选择最有的状态进行转移,其满足最有字结构的性质。

  不妨令 j1 < j2 < i,且 j1 的转移不必 j2 优,从中我们可以发现不需要去求解 j1 直接从 j2 进行转移不会影响答案,且能够节省时间。

  所以我们可以得到式子 f[j2] + (sum[i] - sum[j2] + i - (j2 + 1) - L)2 <= f[j1] + (sum[i] - sum[j1] + i - (j1 + 1) - L)2,由于式子过于复杂我们考虑换元。

  不妨再令 a[i] = sum[i] - L + i - 1,b[i] = sum[i] + i

  所以式子转换成:f[j2] + ( a[i] - b[j2] )<= f[j1] + ( a[i] - b[j1] )2

  最后可得:f[j2]+ b[j2]-f[j1]-b[j1]2 <= 2 × a[i] ×( b[j2] - b[j1] ) 所以此时我们可以考虑斜率优化具体的分析请详见一下本人博客

代码:

本人压行怪物请见谅:

#include<bits/stdc++.h>
#define MAXN 50010
#define LL long long
using namespace std; LL f[MAXN], sum[MAXN], a[MAXN], b[MAXN];
int n, L, que[MAXN]; int main(){
scanf("%d%d", &n, &L);
for (int i=; i<=n; i++){
LL x;
scanf("%lld", &x);
sum[i]=sum[i-]+x;
}
for (int i=; i<=n; i++) a[i]=sum[i]+i--L, b[i]=sum[i]+i;
int head=, tail=;
for (int i=; i<=n; i++){
while (head<tail && *a[i]*(b[que[head+]]-b[que[head]])>=f[que[head+]]-f[que[head]]+b[que[head+]]*b[que[head+]]-b[que[head]]*b[que[head]]) ++head;
f[i]=f[que[head]]+(a[i]-b[que[head]])*(a[i]-b[que[head]]);
while (head<tail && (f[que[tail]]+b[que[tail]]*b[que[tail]]-f[que[tail-]]-b[que[tail-]]*b[que[tail-]])*(b[i]-b[que[tail]])>=(f[i]+b[i]*b[i]-f[que[tail]]-b[que[tail]]*b[que[tail]])*(b[que[tail]]-b[que[tail-]])) --tail;
que[++tail]=i;
}
printf("%lld\n", f[n]);
return ;
}

最新文章

  1. inline-block元素vertical-align的问题分析
  2. DOCKER是什么,它解决了什么问题?(转)
  3. jsoup解析HTML及简单实例
  4. Windows无法安装到GPT分区形式磁盘的解决办法
  5. verilog中级别到底是什么?级别的分类是什么???
  6. 使用MyBatis的resultMap高级查询时常用的方式总结
  7. uva 10130 SuperSale
  8. JavaScript原型,原型链 !
  9. android Service简介及启动关闭方式
  10. mysql长连接和短连接的问题
  11. Erlangserver紧内存优化解决方案
  12. 机器学习基石 1 The Learning Problem
  13. 《NET 设计规范》第 2 章 框架设计基础
  14. android文件混淆详解
  15. Centos7使用yum快速安装ansible
  16. [转]pyCharm最新2018激活码
  17. @ConfigurationProperties和@Value 注入
  18. Android 注解的使用与注意事项
  19. ph 的使用步骤
  20. Java快速入门-04-Java.util包简单总结

热门文章

  1. SecureCRT无法连接虚拟机Linux—虚拟网卡(NAT方式)IP(169.254.xx.xx)无效问题
  2. JavaScript特点、优缺点及常用框架
  3. 用Eclipse 开发Dynamic Web Project应用程序
  4. matlab实现gabor滤波器的几种方式
  5. asp.net中通过form表单submit提交到后台的实例
  6. 借助Code Splitting 提升单页面应用性能
  7. liunx下忘记root密码的解决方法
  8. input禁止显示用户输入历史记录
  9. IOS之UIAlert​Controller
  10. 中国区 Azure 应用程序开发说明