有n天,每天訓練收益為ei,如果連續訓練了k天,則必須休息一天,問訓練的最大收益,1<=n,k<=1e5
dp[i]表示第i天不訓練,前i天的最小損失,dp[i] = min(dp[i],dp[j] - a[i]) ( j = i-1 , i-2 ,,,, i-k-1 )
答案就是第n+1天不訓練,sum-前n天的最小損失嘍
這樣還是會超時,需要單調佇列優化,單調佇列:把佇列的最值維護在隊首,不考慮其它元素,佇列總是單調遞增或遞減的,所以出隊、入隊操作和普通佇列不一樣。
**:
1 #include2 #include3 #include4 #include5 #include6 #include7using
namespace
std;
8 typedef long
long
ll;9 ll a[100005]=,dp[100005
];10 typedef struct
nodenode;
14 node que[100005
];15
16int
main()
1723
24 dp[0]=0,que[++r].v=0,que[r].num=0;25
26for(int i=1;i<=n+1;i++)
2734 printf("
%lld\n
",dp[n+1]+sum);
35 }
單調佇列 優化DP
佇列元素保持單調遞增 減 而保持的方式就是通過插隊,把隊尾破壞了單調性的數全部擠掉,從而使佇列元素保持單調。單調佇列的作用 優化dp。許多單調佇列優化的dp可以使複雜度直接降維,下面就以最簡單的一道題為例 在某兩座城市之間有 n 個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續...
單調佇列優化dp
形如f i max wi的問題都可以用單調佇列優化。例題 板題 注意乙個地方 求完所有的f後 ans不是f n 而是後面的一段字尾的f 注意字尾的左端點。很顯然是rmq問題 計算字首和sum i 對於固定的右端點 i,我們想讓答案最大等價於max,可以用個單調佇列維護。但是隨便乙個資料結構直接on ...
DP 單調佇列優化
使用單調佇列優化的題目具有這樣的特點,他需要我們維持一段區間內的某個最優值,這個區間是隨著遍歷的順序變化的,但是其變化一定具有這樣的特性,也即維持的區間左右端點一定是單調遞增的,而不能出現回流的現象,否則我們在維持佇列單調性過程中剪枝的資料可能是新的區間中的最大值。維持區間最優值的方法有很多,例如靜...