K-Anonymous Sequence POJ - 3709

给一个不降的序列,以及一个数 kkk,对这个序列进行操作,允许对某些数减去一定的值,要求操作之后的序列的每种取值的个数至少为 kkk,定义花费为修改前后每个数的绝对值的和,求最小花费。

令 dp[i]dp[i]dp[i] 表示前 iii 个数的最小花费,则转移方程为:

dp[i]=min⁡{dp[j]+s[i]−s[j]−a[j+1]∗(i−j)}dp[i]=\min\{dp[j]+s[i]-s[j]-a[j+1]*(i-j)\} dp[i]=min{dp[j]+s[i]−s[j]−a[j+1]∗(i−j)}

其中 a[i]a[i]a[i] 为序列中第 iii 个元素的值,s[i]s[i]s[i] 为前缀和,这个式子的意思是前 iii 个数的最小花费为前 jjj 个数的最小花费加上第 j+1j+1j+1 个数到第 iii 个数都改成 a[j+1]a[j+1]a[j+1] 的花费。

考虑斜率DP,设 k<jk<jk<j ,且 jjj 优于 kkk,则有:

dp[j]+s[i]−s[j]−a[j+1]∗(i−j)<dp[k]+s[i]−s[k]−a[k+1]∗(i−k)(dp[j]−s[j]+ja[j+1])−(dp[k]−s[k]+ka[k+1])<i(a[j+1]−a[k+1])yj−ykxj−xk<i\begin{aligned} dp[j]+s[i]-s[j]-a[j+1]*(i-j)&<dp[k]+s[i]-s[k]-a[k+1]*(i-k)\\ (dp[j]-s[j]+ja[j+1])-(dp[k]-s[k]+ka[k+1])&<i(a[j+1]-a[k+1])\\ \frac{y_j-y_k}{x_j-x_k}&<i \end{aligned} dp[j]+s[i]−s[j]−a[j+1]∗(i−j)(dp[j]−s[j]+ja[j+1])−(dp[k]−s[k]+ka[k+1])xj​−xk​yj​−yk​​​<dp[k]+s[i]−s[k]−a[k+1]∗(i−k)<i(a[j+1]−a[k+1])<i​

其中 yj=dp[j]−s[j]+ja[j+1],xj=a[j+1]y_j=dp[j]-s[j]+ja[j+1],x_j=a[j+1]yj​=dp[j]−s[j]+ja[j+1],xj​=a[j+1]。

代码如下(注意在队列尾进行判断的时候此处必须是 ≤\le≤):

#include<iostream>
#include<cstdio>
#include<cstring>
//#define WINE
#define INF 0x3f3f3f3f
#define MAXN 500100
using namespace std;
typedef long long ll;
int n,k,T,q[MAXN],h,t;
ll s[MAXN],dp[MAXN],a[MAXN];
ll up(int j,int k){return dp[j]-s[j]+j*a[j+1]-(dp[k]-s[k]+k*a[k+1]);
}
ll down(int j,int k){return a[j+1]-a[k+1];
}
ll getDP(int k,int i){return dp[k]+s[i]-s[k]-a[k+1]*(i-k);
}
int main(){#ifdef WINEfreopen("data.in","r",stdin);
#endifscanf("%d",&T);while(T--){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);s[i]=s[i-1]+a[i];}h=t=0;q[t++]=0;for(int i=k;i<=n;i++){while(h+1<t&&up(q[h+1],q[h])<i*down(q[h+1],q[h]))h++;dp[i]=getDP(q[h],i);int j=i-k+1;if(j<k)continue;while(h+1<t&&up(j,q[t-1])*down(q[t-1],q[t-2])<=up(q[t-1],q[t-2])*down(j,q[t-1]))t--;q[t++]=j;}printf("%lld\n",dp[n]);}return 0;
}

POJ 3709 K-Anonymous Sequence 斜率DP相关推荐

  1. poj 3254 Corn Fields (状态压缩DP)

    题目:http://poj.org/problem?id=3254 思路见代码: #include<iostream> using namespace std;const int MOD= ...

  2. POJ 1185 炮兵阵地(状态压缩DP)

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...

  3. POJ 1821 Fence ★(单调队列优化DP)

    题目大意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以 ...

  4. hdu 3480 斜率dp

    思路:很普通的斜率dp #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  5. HDU 3669 Cross the Wall(斜率DP+预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...

  6. bzoj 3437: 小P的牧场(斜率DP)

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1493  Solved: 830 [Submit][Status][Disc ...

  7. bzoj 1010: [HNOI2008]玩具装箱toy(斜率dp)

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

  8. [SCU 4509] Snowdrop修长廊 (斜率DP)

    SCU - 4509 使用若干条线段,覆盖坐标轴上的 N个点 覆盖 [i,j][i, j]的代价为cost(i,j)=W+(xi−xj)2cost(i,j) = W + (x_i-x_j)^2 求覆盖 ...

  9. 紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp

    题目链接: https://vjudge.net/problem/UVA-1626 题意: 题解: dp[i][j]:= i~j需要最少的括号 区间dp: dp[i][j] = min(dp[i][j ...

  10. 算法训练 K好数(dp+动态规划)

    问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...

最新文章

  1. Android项目Build报错Unable to execute dx(65535问题解决方案)
  2. MyBatis 源码分析系列文章导读
  3. MyBatisPlus条件构造器带条件更新update使用
  4. 吴恩达 coursera ML 第三课总结
  5. 【H2 Database】安装
  6. curl命令java_Java中的curl命令
  7. 帆软单点登录_电子表格FineReport教程:[20]CAS单点登录
  8. 列式存储ClickHouse(二)接口
  9. 理解包装类 Integer 的底层实现,教你破解所有面试难题!
  10. 3.9 限制root远程登录
  11. Ubuntu打开swf文件
  12. 怎么用计算机测试手速,火凤凰游戏APM实时手速测试器
  13. 20170603学习笔记整理
  14. python爬虫(20)使用真实浏览器打开网页的两种方法
  15. mmc驱动框架基础介绍
  16. AndroidStudio0.5.5发布
  17. css3探测光圈_CSS3按钮鼠标悬浮实现光圈效果
  18. ecu故障现象_汽车电脑ECU的故障诊断检修方法9种
  19. altium designer中inpolygon与ispolygon都是什么意思,更详细解释在《Altium Designer 高级规则语法参考 》一书中或在官方网站搜索www.altium.com
  20. 盘点2010年IT业界十大囧事 iPhone居首

热门文章

  1. excel取消隐藏_Excel表格如何快速隐藏并取消隐藏
  2. 科学-建筑学:建筑学百科
  3. Android 暗黑模式
  4. Django中ForeignKey和ManyToMany使用探究:
  5. 名言警句 研习补弱 历年珍题
  6. OSChina 周五乱弹 —— 我FFFF……佛慈悲
  7. Python-torch.optim优化算法理解之optim.Adam()
  8. 计算机表格数字怎么,电脑表格数字打不出来
  9. python多条件求和_使用sumifs进行多条件求和
  10. 如何把“春节”这个主题写成万用的申论范文