選擇數字[單調佇列+DP]
我們發現直接dp不好做
其實選的最大值就是總的值減去選的最小值
我們選最小值要保證任意k個選一個,這就是比較顯然的dp了
單調佇列維護一下就好
#include<bits/stdc++.h> #define N 100050 #define LL long long #define inf 1000000000000000 using namespace std; int n,k,a[N],q[N]; LL f[N],tot,ans=inf; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]),tot+=a[i]; int l=1,r=0; q[++r]=0; for(int i=1;i<=n;i++){ while(l<=r && i-q[l]>k+1) l++; f[i] = (LL)f[q[l]] + a[i]; while(l<=r && f[i]<f[q[r]]) r--; q[++r] = i; } for(int i=n-k;i<=n;i++) ans = min(ans,f[i]); printf("%lld",tot-ans); return 0; }
相關推薦
選擇數字[單調佇列+DP]
傳送門 我們發現直接dp不好做 其實選的最大值就是總的值減去選的最小值 我們選最小值要保證任意k個選一個,這就是比較顯然的dp了 單調佇列維護一下就好 #include<bits/stdc++.h> #define N 100050 #defin
選舉 - 線段樹 -單調佇列 - dp
題目大意: 給定序列a,滿足 a i ∈
codeforces 1077F2. Pictures with Kittens (hard version)單調佇列+dp
div3挑戰一場藍,大號給基佬紫了,結果從D開始他開始瘋狂教我做人??表演如何AKdiv3???? 比賽場上:A 2 分鐘,B題蜜汁亂計數,結果想得繞進去了20多分鐘,至此GG,C秒出,D。。。還在想怎麼做就告訴我二分答案,好那繼續秒出。他看F我看E,沒思路互換,F題都讀了半天,其實就是我YY的題意,然後發
Codeforces Round #521 (Div. 3) F2 單調佇列dp
F2. Pictures with Kittens (hard version) 題意:給你n個有權值的點,你從位置0開始,每次操作可以跳到當前位置+k範圍內的點並獲得其權值(不能跳到原點),要求必須操作x次,且最後的位置+k必須要大於n,求可以獲得的最大權值。 思路:設d[ i ][
Fence[單調佇列+DP]
傳送門 f[i][j] 表示第i個工匠做到j的最大價值 顯然j應滿足 我們將f[i][j]變形 單調佇列維護f[i-1][x]-x*p[i] 每次先將f[i-1][...]合法的()中的放入單調佇列 , 每次更新前除去不合法狀態()
Power收集[單調佇列+DP]
傳送門 將上一輪合法的加進來 , 更新答案之前彈出和重新將後面和發的放進來就可以了 #include<bits/stdc++.h> #define N 4050 using namespace std; int val[N][N],f[N][N]; i
【CF1077F2】Pictures with Kittens 單調佇列+dp
題目大意:給定一個長度為 N 的序列,點有點權,從序列中選出恰好 X 個數,並且保證任意連續的 K 個數中均有一個被選中,求選出的點權最大是多少。 題解:此題可以作為 烽火傳遞+ 來處理,只不過在烽火傳遞的基礎上加了選出恰好 X 個數,因此只需在狀態維度上加上一維選出的個數即可,\(dp[i][j]\) 表
【單調佇列DP】烽火傳遞
** 1565 – 【堆練習】烽火傳遞3577 ** Description 烽火臺是重要的軍事防禦設施,一般建在交通要道或險要處。一旦有軍情發生,則白天用濃煙,晚上有火光傳遞軍情。在某兩個城市之間有n(n<=200000)座烽火臺,每個烽火臺發出訊號
單調佇列+dp 琪露諾+NOIP 2017 跳房子
一、琪露諾: 題意:一開始在000號格子上,每個格子有一個權值,在格子iii時,下一次可以移動到區間[i+l,i+r][i+l,i+r][i+l,i+r]中的任意一格,只要下一步的位置編號大於nnn就算
Codeforces Round #521 (Div. 3) F2 單調佇列dp
題意:給你n個有權值的點,你從位置0開始,每次操作可以跳到當前位置+k範圍內的點並獲得其權值(不能跳到原點),要求必須操作x次,且最後的位置+k必須要大於n,求可以獲得的最大權值。 思路:設d[
NOIP模擬:最佳序列(單調佇列DP)
給一個序列,求所有滿足長度在給定 L,R之中的序列的平均值的最大值。 題解:單調佇列+DP。 看到平均值應該想到二分平均值然後再每個數減去這個平均值,此時所有平均值滿足大等於當前二分的平均值
2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌圖(仙人掌+單調佇列優化dp)
傳送門 求仙人掌的直徑。 感覺不是很難。 分點在環上面和不在環上分類討論。 不在環上直接樹形 d p
P3084 [USACO13OPEN]照片Photo (dp+單調佇列優化)
題目連結:傳送門 題目: 題目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always
HDU 3401 Trade(DP + 單調佇列優化)
任重而道遠 Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study. He forecasts the next T days' stock market. On
CF939F Cutlet (單調佇列優化DP)
題目大意:要煎一塊有兩個面的肉,只能在一段k不相交的時間段$[l_{i},r_{i}]$內翻轉,求$2*n$秒後,保證兩個面煎的時間一樣長時,需要最少的翻轉次數,$n<=100000$,$k<=100$ 神仙單調佇列優化$DP$, [NOI2005]瑰麗華爾茲 也有類似的壓時間段的套路,但這道題
luogu P3657 (NOIP2017) 跳房子(二分+DP+單調佇列)
題面 傳送門 分析 顯然答案有單調性,可以二分答案,設當前二分值為g,根據題意我們可以求出跳躍長度的範圍[l,r] 考慮DP 子狀態: dp[i]表示跳到第i個點時的最大和 狀態轉移方程 \(dp[i]=max(dp[i],dp[j]+a[i]) (j \in [1,n),x[i]-x[j] \in [
[P1020]導彈攔截 (貪心/DP/二分/單調佇列)
一道很經典的題 這道題就是要求一個最長單調不升子序列和一個最長單調上升子序列。 先打了一個n2複雜度的 用DP #include<bits/stdc++.h> using namespace std; #define N 10005 int f[N],a[N]; int n;
[USACO18JAN]Lifeguards P 洛谷黑題,單調佇列優化DP
傳送門:戳我 這道題有兩個版本,S和P,S是K等於1的情況,顯然可以用線段樹水過。 P版本就難了很多,洛谷黑題(NOI/NOI+/CTSC),嘿嘿。 我自己也不是很理解,照著題解寫了一遍,然後悟到了一點東西。 dp方程很好想: dp[i][j]表示處理到第i個元素,已經刪掉了j個,但取了第i個。
HDU 3401 Trade(dp+單調佇列優化)
Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5843 &
Leetcode 221. Maximal Square 單調佇列和dp兩種思路求解
題意 給定一個0,1矩陣,希望找到矩陣中的一個面積最大的聯通正方形區域,這個區域中全是1 思路 基本思路:找面積最大的,其實就是找最長的邊長,我們的思路都是以這個為出發點的 dp思路 整體來看,就是一個二維dp,是這類矩陣問題的一個