洛谷P1868 飢餓的奶牛 DP

2021-08-28 05:09:45 字數 2333 閱讀 5979

時空限制 1000ms / 128mb

題目描述

有一條奶牛衝出了圍欄,來到了一處聖地(對於奶牛來說),上面用牛語寫著一段文字。

現用漢語翻譯為:

有n個區間,每個區間x,y表示提供的x~y共y-x+1堆優質牧草。你可以選擇任意區間但不能有重複的部分。

對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。

輸入格式:

第一行,n,如題

接下來n行,每行乙個數x,y,如題

輸出格式:

乙個數,最多能吃到的牧草堆數

說明

1<=n<=150000

0<=x<=y<=3000000

題目分析

先將所有草堆以右端點為第一關鍵字排序

d p[

i]

dp[i]

dp[i

]表示考慮前i

ii堆草能獲得的最大數量

那麼有dp轉移

d p[

i]=m

ax(d

p[i−

1],r

i−li

+1,m

ax(d

p[j]

+ri−

li+1

))(1

<=j

rj

)dp[i]=max(dp[i-1],\ r_i-l_i+1,\ max(dp[j]+r_i-l_i+1))(1<=jdp

[i]=

max(

dp[i

−1],

ri​−

li​+

1,ma

x(dp

[j]+

ri​−

li​+

1))(

1<=j

rj​​)

顯然dp[i

]dp[i]

dp[i

]一定是不下降的

若不存在j

jj滿足(

1<=j

rj

)(1<=j(1

<=j

rj​​)

,則d p[

i]=m

ax(d

p[i−

1],r

i−li

+1

)dp[i]=max(dp[i-1],\ r_i-l_i+1)

dp[i]=

max(

dp[i

−1],

ri​−

li​+

1)也就是要麼不選第i

ii堆,要麼只選第iii堆

而如果存在這樣的j

jj直接列舉j

jj去更新是o(n

2)

o(n^2)

o(n2

)的,肯定t

但注意到dp[

i]

dp[i]

dp[i

]的不下降性

所以直接二分尋找滿足1

<=j

<

i1<=j

1<=j

<

i且i

ii最近的j

jj即可

#include

#include

#include

#include

#include

#include

using

namespace std;

intread()

while

(ss>=

'0'&&ss<=

'9')

return f*x;

}const

int maxn=

200010

;int n;

struct noderem[maxn]

;bool

cmp(node a,node b)

int dp[maxn]

;int

find

(int x)

return ans;

}int

main()

printf

("%d"

,dp[n]);

return0;

}

洛谷P1868 飢餓的奶牛

有一條奶牛衝出了圍欄,來到了一處聖地 對於奶牛來說 上面用牛語寫著一段文字。現用漢語翻譯為 有n個區間,每個區間x,y表示提供的x y共y x 1堆優質牧草。你可以選擇任意區間但不能有重複的部分。對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。輸入格式 第一行,n,如題 接下來n...

P1868 飢餓的奶牛

有一條奶牛衝出了圍欄,來到了一處聖地 對於奶牛來說 上面用牛語寫著一段文字。現用漢語翻譯為 有n個區間,每個區間x,y表示提供的x y共y x 1堆優質牧草。你可以選擇任意區間但不能有重複的部分。對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。輸入格式 第一行,n,如題 接下來n...

線性動態規劃之 P1868 飢餓的奶牛 打卡打卡!

洛谷鏈結點這裡 好了,這是我找二分例題的時候刷到的,我也不知道為什麼會出來dp區間和 ok,現在一步步來分析題目 第一步,我要處理輸入的資料,假設我有這麼幾段區間,16,20 18,20 19,20 和 1,5 2,5 3,5 4,5 和 8,11 9,11 10,11 那麼你打算怎麼處理它呢?我的...