BZOJ4409 [Usaco2016 Feb]Circular barn 动态规划 斜率优化

时间:2022-09-21 14:34:34

原文链接http://www.cnblogs.com/zhouzhendong/p/8724739.html

题目传送门 - BZOJ4409

题意

  有一个N个点的环,相邻两个点距离是1。点顺时针标号为1..N。最初每一个点是空的。要求最终点i存在ri头牛。你有∑ri头牛。你可以选择最多k个点,然后把你的牛任意分配在这k个点里。之后,每一头牛可以选择不动,也可以顺时针走d格并呆在那里。这样,它要耗费d的能量。通过合理选择点、合理分配牛、合理安排牛的走动,使得消耗的总能量最小。

  $n\leq 1000,k\leq 7,r_i\leq 10^6$

题解

  首先,我们来说一个比较simple的结论。

  原始分配方案的一个点的牛不可能走到下一个点。

  很显然,如果可以走到下一个点,那么直接分配在下一个点更优。

  于是我们发现这就是分段贡献。

  考虑先断环为链,所以我们先用掉一层循环,来枚举环的开头。(事实上我是通过顺时针旋转数列实现的)

  然后考虑到剩下的部分,是个DP。

  很容易写出方程:(为了方便,这里的$a_i$即题目描述的$r_i$)

  $$dp_{r,i}=min\{dp_{r-1,j}+\sum_{k=j+1}^i (k-j-1)a_k\}\ \ \ (0\leq j<i)$$

  然后就是经典的斜率优化套路了。

  关于DP的斜率优化看这里$\longrightarrow$传送门

  可以参照下面两道题的做法,这里我不再赘述了。

  BZOJ1096

  BZOJ3675

  然后注意一下初始的时候的$dp_{0,i}$的值为$\infty$(BZOJ3675里面求的是最大值,故初始化为0;但这里求的是最小值。)。

  时间复杂度$O(n^2k)$。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1005;
int n,R,q[N],head,tail;
LL a[N],sum[N],vsum[N],x[N],y[N],dp[10][N],ans=1LL<<60;
int main(){
scanf("%d%d",&n,&R);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for (int _i_=1;_i_<=n;_i_++){
sum[0]=vsum[0]=0;
for (int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i],vsum[i]=vsum[i-1]+a[i]*(i-1);
for (int i=1;i<=n;i++)
dp[0][i]=1LL<<45;
dp[0][0]=0;
for (int r=1;r<=R;r++){
for (int i=0;i<=n;i++)
x[i]=i,y[i]=dp[r-1][i]-vsum[i]+sum[i]*i;
head=1,tail=0;
q[++tail]=0;
for (int i=1;i<=n;i++){
int j=q[head+1],k=q[head];
while (tail-head>0&&y[j]-y[k]<=sum[i]*(x[j]-x[k]))
head++,j=q[head+1],k=q[head];
j=k;
dp[r][i]=dp[r-1][j]+vsum[i]-vsum[j]-(sum[i]-sum[j])*j;
j=q[tail],k=q[tail-1];
while (tail-head>0&&(y[i]-y[j])*(x[j]-x[k])<=(y[j]-y[k])*(x[i]-x[j]))
tail--,j=q[tail],k=q[tail-1];
q[++tail]=i;
}
ans=min(ans,dp[r][n]);
}
for (int i=1;i<=n;i++)
a[i-1]=a[i];
a[n]=a[0];
}
printf("%lld",ans);
return 0;
}

  

BZOJ4409 [Usaco2016 Feb]Circular barn 动态规划 斜率优化的更多相关文章

  1. bzoj 4412&colon; &lbrack;Usaco2016 Feb&rsqb;Circular Barn

    4412: [Usaco2016 Feb]Circular Barn Description 有一个N个点的环,相邻两个点距离是1.点顺时针标号为1..N.每一个点有ci头牛,保证∑ci=N.每头牛都 ...

  2. 【bzoj4412】&lbrack;Usaco2016 Feb&rsqb;Circular Barn

    先看成一条链 for一遍找位置 在for一遍算答案 #include<algorithm> #include<iostream> #include<cstring> ...

  3. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  4. &lbrack;bzoj1911&rsqb;&lbrack;Apio2010特别行动队&rsqb; &lpar;动态规划&plus;斜率优化&rpar;

    Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...

  5. &lbrack;bzoj1597&rsqb;&lbrack;usaco2008 mar&rsqb;土地购买 &lpar;动态规划&plus;斜率优化&rpar;

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  6. &lbrack;luogu3648&rsqb;&lbrack;bzoj3675&rsqb;&lbrack;APIO2014&rsqb;序列分割【动态规划&plus;斜率优化】

    题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...

  7. 动态规划&lpar;斜率优化&rpar;:BZOJ 3675 &lbrack;Apio2014&rsqb;序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  8. 动态规划&lpar;斜率优化&rpar;:BZOJ 1010 【HNOI2008】 玩具装箱

    玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8218  Solved: 3233[Submit] Description P 教授要去 ...

  9. BZOJ 1096&colon; &lbrack;ZJOI2007&rsqb;仓库建设(动态规划&plus;斜率优化)

    第一次写斜率优化,发现其实也没啥难的,没打过就随便找了一份代码借(chao)鉴(xi)下,不要介意= = 题解实在是懒得写了,贴代码吧= = CODE: #include<cstdio># ...

随机推荐

  1. Redis数据结构详解之Zset(五)

    序言 Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zset怎么 ...

  2. Linux下的压缩和解压缩命令——tar

    tar命令 选项: -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只 ...

  3. uiimage 上传 数据库

    之前我所接触的上传图片都是直接与服务器交互的,即 app端要做的就是上传到服务器 现在这个项目却是app先上传到"数据库",由"数据库"传到服务端 下面说主题 ...

  4. android常用的快捷键

    Ctrl + shift + O    删除.java文件中所有未用到的引用的包的快捷键 Ctrl+D 删除光标所在行 Ctrl + shift + F   代码整体对齐:如果失效的情况下,就选中代码 ...

  5. &quot&semi;SOAP WebService &quot&semi; 和 &quot&semi;RESTful WebService&quot&semi; 的定义分别是什么???

    一个个来,要知道区别,首先得知道各自的意义及用途web service采用Xml传输结构化的数据,轻量级跨平台而soap则是一种基于http的应用层通讯协议,同样采用xml编码,只不过soap又更进了 ...

  6. 关于RSA加密

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制 ...

  7. ecos的mvcl

    m 数据模型抽象层 v 视图 c 控制器 l 业务逻辑 mvc与mvcl区别 mvc中的m是mvcl中m+l

  8. 1642&colon; &lbrack;Usaco2007 Nov&rsqb;Milking Time 挤奶时间

    1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 582  Solved: 33 ...

  9. 使用element ui 日期选择器获取值后的格式问题

    一般情况下,我们需要给后台的时间格式是: "yyyy-MM-dd" 但是使用Element ui日期选择器获取的值是这样的: Fri Sep :: GMT+ (中国标准时间) 在官 ...

  10. (Python3) 运行结果 &equals; 10,40 的困扰我一顿饭时间的 代码

    a=10 b=30 def kzkzkz(a,b):   #定义一个函数 a=a+b return a b= kzkzkz(a,b) print(a,b)