DP 斜率优化题目/决策单调性题目

斜率优化

冬令营讲到了dp斜率优化后瞎写了一些斜率优化,因为毕竟上次写是老早以前了,当时对这个并不是很理解,现在有一点数学基础,稍微好一点了。

瞎找的斜率优化题,可能有点太水了,我这种这么菜的人竟然都切得那么快。可能难度不够,因为有个y坐标不单调要套个平衡树的我是真不会,这个嘛以后再说了。

1.hdu3507 Print Article

给定非负数列,划成若干块,每块价值是左边那玩意儿。求总权值min.



这个自己写写就可以搞出来了吧,现在看真心不难,除非数值有负的。。那个要平衡树,现在写不动。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
 5 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
 6 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
 7 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
 8 template<typename T>inline T read(T&x){
 9     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1;
10     while(isdigit(c))x=x*10+c-‘0‘,c=getchar();return f?x=-x:x;
11 }
12 const int N=500000+7;
13 ll f[N],C[N],m;
14 int q[N],l,r,n;
15 inline ll Getx(int i){return C[i];}
16 inline ll Gety(int i){return f[i]+C[i]*C[i];}
17
18 int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
19     while(~scanf("%d%lld",&n,&m)){
20         q[l=r=1]=0,f[0]=0;
21         for(register int i=1;i<=n;++i){
22             read(C[i]),C[i]+=C[i-1];
23             while(l<r&&(Gety(q[l+1])-Gety(q[l]))<=2*C[i]*(Getx(q[l+1])-Getx(q[l])))++l;
24             f[i]=f[q[l]]+(C[i]-C[q[l]])*(C[i]-C[q[l]])+m;
25             while(l<r&&(Gety(q[r])-Gety(q[r-1]))*(Getx(i)-Getx(q[r]))>=(Gety(i)-Gety(q[r]))*(Getx(q[r])-Getx(q[r-1])))--r;
26             q[++r]=i;
27         }
28         printf("%lld\n",f[n]);
29     }
30     return 0;
31 }

2.P2365 任务安排

注意一个费用提前计算的思想,就是为了简化维度,并没有明显规定要画成多少块,但块数对f有影响,那可以提前计算对之后的费用加上去,这也应当是对的dp.详见李煜东书上的dp斜率优化。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=5000+7;
 5 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
 6 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
 7 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
 8 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
 9 template<typename T>inline T read(T&x){
10     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1;
11     while(isdigit(c))x=x*10+c-‘0‘,c=getchar();return f?x=-x:x;
12 }
13 ll f[N],t[N],c[N],S;
14 int l,r,n,q[N];
15
16 int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
17     read(n),read(S);
18     for(register int i=1;i<=n;++i)t[i]=read(t[i])+t[i-1],c[i]=read(c[i])+c[i-1];
19     f[l=r=1]=0;
20     for(register int i=1;i<=n;++i){
21         while(l<r&&f[q[l+1]]-f[q[l]]<=(S+t[i])*(c[q[l+1]]-c[q[l]]))++l;
22         f[i]=f[q[l]]+S*(c[n]-c[q[l]])+t[i]*(c[i]-c[q[l]]);
23         while(l<r&&(f[i]-f[q[r]])*(c[q[r]]-c[q[r-1]])<=(f[q[r]]-f[q[r-1]])*(c[i]-c[q[r]]))--r;
24         q[++r]=i;
25     }
26     printf("%lld\n",f[n]);
27     return 0;
28 }

3.P3628 特别行动队

没什要说的,斜率的上凸的优化。斜率负的小心点就行了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
 5 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
 6 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
 7 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
 8 template<typename T>inline T read(T&x){
 9     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1;
10     while(isdigit(c))x=x*10+c-‘0‘,c=getchar();return f?x=-x:x;
11 }
12 const int N=1000000+7;
13 ll f[N],S[N],a,b,c;
14 int n,l,r,q[N];
15 inline ll fy(int i){return f[i]+a*S[i]*S[i]-b*S[i];}
16 inline ll fx(int i){return S[i];}
17
18 int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
19     read(n);read(a),read(b),read(c);q[l=r=1]=0;
20     for(register int i=1;i<=n;++i){
21         S[i]=S[i-1]+read(S[i]);
22         while(l<r&&fy(q[l+1])-fy(q[l])>=2*a*S[i]*(fx(q[l+1])-fx(q[l])))++l;
23         f[i]=f[q[l]]+a*(S[i]-S[q[l]])*(S[i]-S[q[l]])+b*(S[i]-S[q[l]])+c;
24         while(l<r&&(fy(i)-fy(q[r]))*(fx(q[r])-fx(q[r-1]))>=(fy(q[r])-fy(q[r-1]))*(fx(i)-fx(q[r])))--r;
25         q[++r]=i;
26     }
27     printf("%lld\n",f[n]);
28     return 0;
29 }

4.BZOJ3156 防御准备亦无甚要说。longlong注意。状态设计多想想就行,$f_i$表示的是i建塔,从1到i总最小费用,然后转移就简单了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef double db;
 5 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
 6 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
 7 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
 8 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
 9 template<typename T>inline T read(T&x){
10     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1;
11     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
12 }
13 const int N=1000000+7;
14 ll f[N],a[N];
15 int q[N],n,l,r;
16 inline ll y(int j){return f[j]+(1ll*j*(j+1)>>1);}
17
18 int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
19     read(n);for(register int i=1;i<=n;++i)read(a[i]);
20     q[l=r=1]=0;
21     for(register int i=1;i<=n;++i){
22         while(l<r&&y(q[l+1])-y(q[l])<=1ll*i*(q[l+1]-q[l]))++l;
23         f[i]=f[q[l]]+(1ll*(i-q[l])*(i-q[l]-1)>>1)+a[i];
24         while(l<r&&(y(i)-y(q[r]))*(q[r]-q[r-1])<=(y(q[r])-y(q[r-1]))*((ll)i-q[r]))--r;
25         q[++r]=i;
26     }
27     printf("%lld\n",f[n]);
28     return 0;
29 }

5.咕咕咕。。

原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/10389864.html

时间: 2024-10-27 07:33:46

DP 斜率优化题目/决策单调性题目的相关文章

DP + 斜率优化 / 决策单调性 --- [HNOI2008]玩具装箱TOY

[HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中. P教授有编号为\(1......N\)的\(N\)件玩具,第\(i\)件玩具经过压缩后变成一维长度为\(C_{i}\). 为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的. 同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物, 形式地说如果将第\(i\)件玩

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

[ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏.由于地形的不同,在不同工厂建立仓库的费用可能是不同的.第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci.对于没有建立仓库的工厂,其

【BZOJ-4518】征途 DP + 斜率优化

4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][Discuss] Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他

Covered Walkway(HDU4258,dp斜率优化)

Covered Walkway Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Your university wants to build a new walkway, and they want at least part of it to be covered. There are certain points which

【BZOJ-1010】玩具装箱toy DP + 斜率优化

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

hdu 3507(DP+斜率优化)

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 6653    Accepted Submission(s): 2054 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique

BZOJ3437:小P的牧场(DP+斜率优化)

小P的牧场[题目描述]背景:小P 是个特么喜欢玩MC 的孩纸...小P 在MC 里有n 个牧场,自西向东呈一字形排列(自西向东用1…n 编号),于是他就烦恼了:为了控制这n 个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于

【BZOJ-1597】土地购买 DP + 斜率优化

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2931  Solved: 1091[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地