题意

给定$n$个数,将其划分成若干个连续的子序列,求最小价值,数组价值定义为,数组和减去$\lfloor \frac{k}{c} \rfloor$,$k$为数组长度,$c$为给定数


可以列得朴素方程$f_i=\min_{j \le i} {f_j+w(j+1,i)}$,复杂度$O(n^2)$

考虑划分的区间长度$k$,若$k=c$,那么只需要去掉区间的最小值,若$k$是$c$的整数倍,那么需要去掉$k/c$个最小值,那么把$k$分成$k/c$个长度为$c$的段,删除的最小值为每个段的最小值之和一定不小于长度为$k$的段的$k/c$个最小值的和,所以最优的分段一定是分成若干个长度为$c$的段

在考虑$k$不被整除的情况,若$k=c+p,p < k$,那么这一段也只会删掉一个最小值,随着$p$的增大,最小值单调不增,所以不会更优。若$k<c$,那么将不会删除值,也就是代价不会转移,可以将其看成分成$k$个$1$

所以可以将方程化简为$f_i=\min {f_{i-1},f_{i-c}+u(j+1,i) }$ ,$u(i,j)$为$[i,j]$的区间和减去区间最小值,可以利用st表预处理得到

时间复杂度$O(n\log n)$

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n, c, a[100005], st[100005][35];
LL dp[100005], sum;
int min_(int l, int r) {int x = (int)(log(double(r - l + 1)) / log(2.0));return min(st[l][x], st[r - (1 << x) + 1][x]);
}
int main() {scanf("%d%d", &n, &c);for(int i = 1; i <= n; ++i) {scanf("%d", &a[i]); st[i][0] = a[i]; sum += a[i];}for(int j = 1; (1 << j) <= n; ++j) {for(int i = 1; i + (1 << j - 1) <= n; ++i) {st[i][j] = min(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);}}for(int i = c; i <= n; ++i) {dp[i] = max(dp[i - 1], dp[i - c] + min_(i - c + 1, i));}cout << sum - dp[n] << endl;return 0;
}

转载于:https://www.cnblogs.com/ogiso-setsuna/p/8497088.html

【Codeforces Round #466】E. Cashback DP+ST表相关推荐

  1. Codeforces Round#466 E. Cashback

    题目: http://codeforces.com/contest/940/problem/E 题意: 给一串数,能把它分成连续的几段,每段有一个分值,求分值和最小能为多少; 分值计算方法:假设这段有 ...

  2. CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数组 aaa,下标从 000 开始,每次操作分为两个步骤: 构建出数组 bbb,有 bi=gcd(ai,a(i+1)modn)b_i=gcd(a ...

  3. Codeforces 359D Pair of Numbers | 二分+ST表+gcd

    题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...

  4. Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)

    题目链接:http://codeforces.com/contest/940/problem/E 题意:给你一个长为n的序列和一个数字c,你要将这个序列切成若干段,对于每一段,这段中最小的[n/c]个 ...

  5. Codeforces Round #466 (Div. 2)

    http://codeforces.com/contest/940 A水题 //#pragma comment(linker, "/stack:200000000") //#pra ...

  6. Codeforces Round #736 (Div. 2) D. Integers Have Friends ST表gcd + 尺取

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,求一个最长的子序列[l,r][l,r][l,r]满足aimodm=ai+1modm=...=armodma_i\bmod m=a_{i+1 ...

  7. Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory 思维 + dp

    文章目录 题意: 思路 题意: 思路 一开始找规律,表都打好了,没找出来.. 找规律还是适合让队友来. 先考虑第一行,我们先计算第一行的方案数,设f[i][j]f[i][j]f[i][j]表示到了ii ...

  8. Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

    传送门 文章目录 题意: 思路: 题意: 思路: 首先我们知道如果所有数的和summodk!=0sum\bmod k!=0summodk!=0那么此时无解,否则我们设need=sum/kneed=su ...

  9. Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp

    传送门 文章目录 题意: 思路: 题意: 给你一天hhh小时,初始时间是000,每天可以使时间+ai+a_i+ai​或者+ai−1+a_i-1+ai​−1,问最多可以让多少天的时间在[l,r][l,r ...

最新文章

  1. 银行柜台基金买卖现长龙 业内支招宜用新方式
  2. 第1章 Java语言概述
  3. 滨海宣传员——青龙羊毛
  4. Hibernate的dynamic-insert和dynamic-update的使用
  5. 关于UI Automation框架
  6. explain 之 id
  7. c# Invoke和BeginInvoke 区别详解
  8. @RequestParam注解使用
  9. Python报错:PermissionError: [Errno 13] Permission denied 解决方案详解
  10. python内置函数map_Python内置函数(34)——map
  11. 点至直线的距离和垂足点计算
  12. docker容器的使用
  13. Android WebView 调用相机、相册,压缩图片后上传
  14. Java基础系列:判断空指针的三种方式
  15. NOIP2015 pj
  16. 数据结构与算法--散列表
  17. linux服务器好管理吗,给初学者Linux服务器管理建议
  18. 化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业
  19. 干货 | 机器学习模型在携程海外酒店推荐场景中的应用
  20. kingview3d在楼宇行业的应用

热门文章

  1. 亚信科技:新业务成高速增长源动力,吹响全栈式数智化转型号角
  2. 一条sql语句实现一维表生成二维表格
  3. 人工智能——Search搜索问题
  4. (二)TCP客户端/服务器通信------select函数
  5. RIL.java【2】
  6. 基于J2EE架构的项目开发团队中的角色与职责
  7. 大学英语四线上考试翻译题
  8. 7、Callable接口
  9. 解决标题党的计算机算法用户app,今日头条算法工程师:做好推荐必须打击标题党...
  10. 辞职在家半年,有幸获得阿里内推机会,鏖战4面成功拿下offer!