题意:
要把 1~n 1~n分成 k k组,每组内的数必须连续,组与组不相交且每个数必须属于一个组,并且任意ii有一个参数 ti t_i。
如果 [l,r] [l,r]为一组,那么从 l l走到l+1l+1的概率是 tltl \frac{t_l}{t_l},从 l+1 l+1走到 l+2 l+2的概率是 tltl+1+tl+1tl+1 \frac{t_l}{t_{l+1}}+\frac{t_{l+1}}{t_{l+1}},依次类推,从 l l要么走到l+1l+1,要么原地不动,那么组 [l,r] [l,r]的费用就是从 l l走到rr的期望次数。现在要分成 k k组,让总费用最小,每个数仅能属于一个组。
题解:
先推期望公式。
设sum[i]=∑ij=1tisum[i]=\sum_{j=1}^{i}t_i, rev[i]=∑ij=11ti rev[i]=\sum_{j=1}^{i}{1\over t_i},那么从 1 1走到ii的期望 exc[i]=exc[i−1]+sum[i]ti exc[i]=exc[i-1]+{sum[i]\over t_i}。
然后观察得到从 l l走到rr的期望公式 exc[l][r]=exc[r]−exc[l−1]−sum[l−1]∗(rev[r]−rev[l−1]) exc[l][r]=exc[r]-exc[l-1]-sum[l-1]*(rev[r]-rev[l-1])。
然后设 dp[i][j] dp[i][j]表示以前 i i个数成jj段的最小费用。
转移: dp[i][j]=min(dp[l][j−1]+exc[l+1][i]) dp[i][j]=min(dp[l][j-1]+exc[l+1][i])。
发现这是个 O(n2∗k) O(n^2*k)的转移。
当我们的 i i固定的时候,就是要在[1,i−1][1,i-1]找一个最优解 l l,观察形式得出可以斜率优化,O(n∗k)O(n*k)的复杂度就可以过了。
斜率优化可以看这里。
推出斜率公式为

gp(j,k)=y(j,p)−y(k,p)sum[j]−sum[k]

g_p(j,k)=\frac{y(j,p)-y(k,p)}{sum[j]-sum[k]}
其中 y(x,p)=dp[x][p]−exc[x−1]+sum[x−1]∗rev[x−1] y(x,p)=dp[x][p]-exc[x-1]+sum[x-1]*rev[x-1]。
并且推出结论 若k<j<i且g(j,k)<rev[i] 若k,那么对于 i i来说,jj要优于 k k。
由于rev[i]rev[i]随 i i递增而递增,当求解ll的时候,无需二分,只需要维护单调队列的top最优就可以了。
代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
double exc[N] = {0}, sum[N] = {0}, rev[N] = {0};
double t[N];
double dp[N][55];
inline double y(int x, int p){return dp[x][p] - exc[x] + sum[x]*rev[x];
}
inline double g(int j, int k, int p){return (y(j, p)-y(k, p))/(sum[j]-sum[k]);
}
inline double cal(int l, int i){return exc[i]-exc[l]-(rev[i]-rev[l])*sum[l];
}
int q[N], top, tail;
inline void add(int i, int k){while(top < tail-1 && g(i, q[tail-1], k) < g(q[tail-1], q[tail-2], k)) tail--;q[tail++] = i;
}
inline int getmax(int i, int k){while(top < tail-1 && g(q[top+1], q[top], k) < rev[i]) top++;return q[top];
}
int main(){int n, K;scanf("%d%d", &n, &K);for(int i = 1; i <= n; ++i) scanf("%lf", t+i);for(int i = 1; i <= n; ++i){sum[i] = sum[i-1] + t[i];rev[i] = rev[i-1] + 1.0/t[i];exc[i] = exc[i-1] + sum[i]/t[i];}for(int i = 1; i <= n; ++i) dp[i][1] = exc[i];for(int k = 2; k <= K; ++k){top = tail = 0;q[tail++] = 0;for(int i = 1; i <= n; ++i) add(i, k-1);for(int i = 1; i <= n; ++i){if(i >= k){int l = getmax(i, k-1);dp[i][k] = dp[l][k-1] + cal(l, i);}else dp[i][k] = 1e50; //不可能状态}}printf("%.10f\n", dp[n][K]);
}

[斜率优化DP] codeforces 673E. Levels and Regions相关推荐

  1. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  2. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  3. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  4. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  5. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  6. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  7. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  8. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

  9. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

最新文章

  1. Welcome to Swift (苹果官方Swift文档初译与注解三十四)---241~247页(第五章-- 函数)
  2. wireshark协议解析器 源码分析 封装调用
  3. IE与Cognos的那些事
  4. KDT#91 DW/BI系统的营销(二)
  5. python守护进程进程池_Python3标准库:multiprocessing像线程一样管理进程
  6. Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
  7. 解决 IntelliJ IDEA 内置的 Tomcat 日志中显示的中文乱码
  8. Reflector7及破解
  9. 排序算法 —— 堆排序
  10. powershell自动化操作AD域、Exchange邮箱系列(8)—链接操作Sqlserver数据库
  11. windows编程之GDI基础--设备内容(二)
  12. php global没用,global php 不起作用怎么办
  13. HG5520A型多用表校准仪
  14. HFSS印刷偶极子天线(2)
  15. c语言控制手机,怎么写用电脑控制手机的代码
  16. VMware Workstation 不可恢复错误: (vcpu-0)解决方法
  17. 高空瞭望视频监控+三维场景视频融合平台
  18. 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
  19. 毕马威《2021年中国证券业调查报告》:金融科技和数字化将成为发展核心
  20. 等保分保关保密评|四道防线守护网络信息安全

热门文章

  1. 【JavaWeb】四、HTMLCSS
  2. 测试拳击速度软件,有没有专门看拳击的app?推荐一款不错的拳击app
  3. 端到端图像编码和VVC的结合
  4. VS Code设置Vue格式化标签不自动换行
  5. windows的磁盘操作之二——初始化磁盘
  6. python中执行linux命令(调用linux命令)_常见Python中调用Linux命令
  7. 李宏毅-Transformer
  8. 合宙Luat | 最新网红Cat.1开发板全攻略【使用教程+注意事项+设计图纸】
  9. 太有才了!街头创意涂鸦手绘图片欣赏【上篇】
  10. Ubuntu安装宝塔部分展示