POJ2373 Dividing the Path——动态规划+单调队列优化
2011-08-28 14:12
344 查看
利用单调队列进行动态规划。
状态转移方程很容易写出来的:
f[i]=Min{f[j]}+1(i-2*b<=j<=i-2*a)
这样,时间复杂度最坏情况下是O(n^2)的,对于n<=1000000的数据来说,程序根本无法承受
怎么办呢?单调队列很强大!
维护一个单调队列,队列里存的是按符合条件的f数组内值严格单调递增的下标值。很显然,利用队首元素就可以直接转移了。
队首元素要满足的条件很简单嘛,i-2*b<=seq[h]<=1-2*a
中间有一些小小的技巧,比如说,计算每个f值的时候,不是计算出来就将它插入到队列里,而是在计算f[i+2*a]之前把它插入队列中。
不过说了,CODE:
状态转移方程很容易写出来的:
f[i]=Min{f[j]}+1(i-2*b<=j<=i-2*a)
这样,时间复杂度最坏情况下是O(n^2)的,对于n<=1000000的数据来说,程序根本无法承受
怎么办呢?单调队列很强大!
维护一个单调队列,队列里存的是按符合条件的f数组内值严格单调递增的下标值。很显然,利用队首元素就可以直接转移了。
队首元素要满足的条件很简单嘛,i-2*b<=seq[h]<=1-2*a
中间有一些小小的技巧,比如说,计算每个f值的时候,不是计算出来就将它插入到队列里,而是在计算f[i+2*a]之前把它插入队列中。
不过说了,CODE:
Program POJ2373;//By_Poetshy Const maxn=1000006; Var i,m,n,maxinum,mininum,j :Longint; f :Array[0..maxn]of Longint; b,e :Longint; seq :Array[0..maxn*2]of Longint; flag :Array[0..maxn]of Boolean; h,t :Longint; p :Longint; BEGIN readln(n,m); readln(mininum,maxinum); fillchar(flag,sizeof(flag),1); for i:=1 to n do begin readln(b,e); for j:=b+1 to e-1 do flag[j]:=false; end; fillchar(f,sizeof(f),127); f[0]:=0;h:=0;t:=0; for i:=mininum to (m >> 1) do begin p:=i << 1; dec(p,2*mininum); if (p>=0)and(f[p]<(maxlongint>>2)) then begin while (h<=t)and(f[seq[t]]>=f[p])do dec(t); inc(t); seq[t]:=p; end; inc(p,2*mininum); f[p]:=maxlongint; while (h<=t)and(seq[h]<p-2*maxinum)do inc(h); if (h>t)or(not flag[p]) then continue; f[p]:=f[seq[h]]+1; end; if f[m]<(maxlongint>>2) then writeln(f[m])else writeln(-1); END.
相关文章推荐
- POJ2373 Dividing the Path——动态规划+单调队列优化
- 【poj2373】Dividing the Path【单调队列优化dp】
- 单调队列优化动态规划
- 动态规划中的单调队列优化_补充
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
- 洛谷P3628 [APIO2010]特别行动队(动态规划,斜率优化,单调队列)
- POJ 2373 (Dividing the Path)单调队列优化DP
- poj 2373 Dividing the Path(dp+单调队列优化)
- noip2009 道路游戏 (单调队列优化动态规划)
- [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)
- 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)
- poj2373 Dividing the Path 单调队列dp
- hdu 1171 Dividing 单调队列优化dp
- 动态规划中的单调队列优化
- BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)
- Dividing(多重背包、单调队列优化dp)
- UESTC-594 我要长高(动态规划+单调队列优化)
- hdu 4374 单调队列优化动态规划
- BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)