區間最值
題目背景在 f ar
me
rfarmer
farmer
j oh
njohn
john
最喜歡的節日裡,他想要給他的朋友們贈送一些禮物。
由於他並不擅長包裝禮物,他想要獲得他的奶牛們的幫助。你可能能夠想到,奶牛們也不是很擅長包裝禮物,而 far
me
rfarmer
farmer
j oh
njohn
john
即將得到這一教訓。
題目描述f ar
me
rfarmer
farmer
j oh
njohn
john
的 nn
n 頭奶牛 (1≤
n≤10
4)
(1 \leq n \leq 10^)
(1≤n≤1
04) 排成一行,方便起見依次編號為 1
11 ~ nnn。
奶牛 i
ii 的包裝禮物的技能水平為 sis_
si。她們的技能水平可能參差不齊,所以 far
me
rfarmer
farmer
j oh
njohn
john
決定把她的奶牛們分成若干個小組:每一組可以包含任意不超過k
kk 頭的連續的奶牛 (1≤
k≤10
3)
(1 \leq k \leq 10^)
(1≤k≤1
03),並且一頭奶牛不能屬於多於乙個小組。由於奶牛們會互相學習,這一組中每一頭奶牛的技能水平會變成這組中水平最高的奶牛的技能水平。
請幫助 far
me
rfarmer
farmer
j oh
njohn
john
求出:在他這樣地安排分組的情況下,可以達到技能水平之和的最大
值。
輸入格式輸入的第一行包含 n
nn 和 kkk。
以下 n
nn 行按照 n
nn 頭奶牛的排列順序 (1
11 ~ n
nn) 依次給出她們的技能水平,技能水平是乙個不超過 105
10^10
5 的正整數。
輸出格式輸出f ar
me
rfarmer
farmer
j oh
njohn
john
通過將連續的奶牛進行分組可以達到的最大技能水平和。
樣例這道題的資料,搜尋肯定是不能全過的。樣例輸入
7 31157
92510
樣例輸出
樣例解釋
在這個樣例中,最優的方案是將前三頭奶牛和後三頭奶牛分別分為一組,中間的奶牛單獨成為一組 (任意一組的奶牛數量可以小於 k
kk)。
這樣能夠有效地將 7
77 頭奶牛的技能水平提高至 15、15
、15、9
、10、10
、10
15、15、15、9、10、10、10
15、15、
15、9
、10、
10、1
0,和為 84
8484
。
我們需要另想其他的方法。
那可不可以用 dpdp
dp呢?如果可以,就得有 最優子結構 和 重疊子問題。
我們可以設 dp[
i]
dp[i]
dp[i
] 表示 從 第 1
11 頭奶牛 到 第 n
nn頭奶牛 的最大技能水平和。
在計算 dp[
i]
dp[i]
dp[i
] 的時候,可以用 j
jj 列舉 i−k
+1
i - k + 1
i−k+
1 到 i
ii 的奶牛,讓 j
jj ~ i
ii 的這些奶牛分成一組,求出它們的技能水平和的最大值,再與前面的 dp[
j−1]
dp[j - 1]
dp[j−1
] 相加,就是當 j
jj ~ i
ii為一組時的最大技能水平和。
那麼怎麼求 j
jj ~ i
ii奶牛的最大技能水平呢,不過兔兔沒有用 rmq
rmqrm
q。我們可以從 i
ii ~ j
jj 倒著迴圈列舉 s[j
]s[j]
s[j]
,與前面求出的 i
ii ~ j+1
j + 1
j+1 的最大值和 s[j
]s[j]
s[j]
做比較,就可以求出 i
ii ~ j
jj 奶牛的技能水平最大值了。
兔兔的**如下(但是不要抄襲喲~):
#include
const
int maxn =
1e4, maxk =
1e3;
int n, k;
int s[maxn +5]
;int dp[maxn +5]
, maxs[maxn +5]
;// dp[i] 前i頭奶牛 可以達到的技能水平之和 的 最大值
// maxs[j] 在求解 第i頭奶牛 時, 它到 第j頭奶牛 的最大水平
intmax
(int a,
int b)
// 最大值函式 max
intmain()
printf
("%d\n"
, dp[n]);
// 輸出答案
return0;
}
兔兔 的 題解 噴水裝置
題目描述 在乙個長 l ll 公尺,寬 w ww 公尺的草坪裡裝有 n nn 個澆灌噴頭。每個噴頭都裝在草坪中心線上 離兩邊各 w 2 frac w 2 2w 公尺 我們知道每個噴頭的位置 c cc 離草坪中心線左端的距離 以及它能覆蓋到的澆灌範圍 rrr。請問 最少需要開啟多少個噴頭才能澆灌整塊草...
兔兔 的 題解 最短路計數
題目描述 給出乙個 n nn 個頂點 m mm 條邊的無向無權圖,頂點編號為 1 11 nnn。問從頂點 1 11 開始,到其他每個點的最短路有幾條。輸入格式 第一行包含 2 22 個正整數 n,m n,m n,m,為圖的頂點數與邊數。接下來 m mm 行,每行兩個正整數 x,y x,y x,y,表...
兔兔 的 題解 拆分自然數
題目描述 任何乙個大於 1 11 的自然數 n n 45 n n 45 n n 45 總可以拆分成若干個小於 n nn 的自然數之和。輸入格式 輸入只有 1 11 行,包含 1 11 個整數 n nn 表示需要拆分的數字。輸出格式 對於輸入的 n nn 輸出所有的拆分方法 字典 序小的先 輸出 字典...