日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【洛谷】【动态规划+单调队列】P1725 琪露诺

發(fā)布時(shí)間:2024/4/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【洛谷】【动态规划+单调队列】P1725 琪露诺 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【題目描述:】

在幻想鄉(xiāng),琪露諾是以笨蛋聞名的冰之妖精。

某一天,琪露諾又在玩速凍青蛙,就是用冰把青蛙瞬間凍起來。但是這只青蛙比以往的要聰明許多,在琪露諾來之前就已經(jīng)跑到了河的對(duì)岸。于是琪露諾決定到河岸去追青蛙。

小河可以看作一列格子依次編號(hào)為0到N,琪露諾只能從編號(hào)小的格子移動(dòng)到編號(hào)大的格子。而且琪露諾按照一種特殊的方式進(jìn)行移動(dòng),當(dāng)她在格子i時(shí),她只移動(dòng)到區(qū)間[i+l,i+r]中的任意一格。你問為什么她這么移動(dòng),這還不簡單,因?yàn)樗潜康鞍 ?/span>

每一個(gè)格子都有一個(gè)冰凍指數(shù)A[i],編號(hào)為0的格子冰凍指數(shù)為0。當(dāng)琪露諾停留在那一格時(shí)就可以得到那一格的冰凍指數(shù)A[i]。琪露諾希望能夠在到達(dá)對(duì)岸時(shí),獲取最大的冰凍指數(shù),這樣她才能狠狠地教訓(xùn)那只青蛙。

但是由于她實(shí)在是太笨了,所以她決定拜托你幫它決定怎樣前進(jìn)。

開始時(shí),琪露諾在編號(hào)0的格子上,只要她下一步的位置編號(hào)大于N就算到達(dá)對(duì)岸。

【輸入格式:】

第1行:3個(gè)正整數(shù)N, L, R

第2行:N+1個(gè)整數(shù),第i個(gè)數(shù)表示編號(hào)為i-1的格子的冰凍指數(shù)A[i-1]

【輸出格式:】

一個(gè)整數(shù),表示最大冰凍指數(shù)。保證不超過231-1

?

[算法分析:]

一道典型的DP題,已知a[i]為點(diǎn)i的冰凍指數(shù),設(shè)f[i]為到達(dá)點(diǎn)i時(shí)獲得的最大冰凍指數(shù)

f[i]的狀態(tài)是由f[i+l, i+r]轉(zhuǎn)移來的

f[r]的狀態(tài)是由f[i-r, i-l]得到的.

可以求得狀態(tài)轉(zhuǎn)移方程:

  f[i] = max{f[i - j]} + a[i]

  l?<= j <=?r <=?i

時(shí)間復(fù)雜度為O(n2)n?≤ 200000?的范圍顯然是超時(shí)了.

考慮如何優(yōu)化:

顯然對(duì)于求max{f[i - j]}的過程是可以優(yōu)化的,

用優(yōu)先隊(duì)列或者線段樹?O(n log2 n)確實(shí)是一個(gè)很優(yōu)秀的復(fù)雜度,但是還有更優(yōu)的:

單調(diào)隊(duì)列,時(shí)間復(fù)雜度為O(n).

每次把一個(gè)f[p]值放入deque中,維護(hù)序列的單調(diào)性(從大到小),

但如果某一次隊(duì)頭的元素的坐標(biāo)已經(jīng)不足以跳到當(dāng)前點(diǎn)了,就要把隊(duì)首pop出去

所以deque中存放的應(yīng)是一個(gè)結(jié)構(gòu)體或者pair.

那有沒有可能在pop隊(duì)尾的時(shí)候把之后的最優(yōu)解pop掉呢?

現(xiàn)在要加入隊(duì)列的元素坐標(biāo)一定比隊(duì)尾元素要大,而其值也比需要被pop掉的隊(duì)尾元素大,

所以最優(yōu)解不管怎么pop都會(huì)在隊(duì)列里。

?

[Code:]

1 //P1725 琪露諾 2 #include<iostream> 3 #include<cstdio> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 8 const int MAXN = 200000 + 1; 9 10 int n, l, r; 11 int a[MAXN]; 12 int f[MAXN]; 13 struct Node { 14 int v, num; 15 }; 16 17 deque<Node> q; 18 19 inline int read() { 20 int x=0, f=1; char ch=getchar(); 21 while(ch<'0' || ch>'9') { 22 if(ch == '-') f = -1; 23 ch = getchar(); 24 } 25 while(ch>='0' && ch<='9') 26 x=(x<<3)+(x<<1)+ch-48, ch=getchar(); 27 return x * f; 28 } 29 30 int main() { 31 n = read(), l = read(), r = read(); 32 for(int i=0; i<=n; ++i) 33 a[i] = read(); 34 int p = 0; 35 for(int i=l; i<=n; ++i) { 36 // 求max{f[i-r, i-l]} 37 // int maxn = 1 << 31; 38 // int s = i-r<0 ? 0 : i-r; 39 // for(int j=s; j<=i-l; ++j) 40 // maxn = max(maxn, f[j]); 41 while(!q.empty() && q.back().v < f[p]) 42 q.pop_back(); 43 q.push_back((Node){f[p], p}); 44 while(q.front().num + r < i) q.pop_front(); 45 f[i] = q.front().v + a[i]; 46 ++p; 47 } 48 int ans = 1 << 31; 49 for(int i=n-r+1; i<=n; ++i) 50 ans = max(ans, f[i]); 51 printf("%d\n", ans); 52 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/devilk-sjj/p/9072387.html

總結(jié)

以上是生活随笔為你收集整理的【洛谷】【动态规划+单调队列】P1725 琪露诺的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。