题面 题解(单调队列优化DP) 代码 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int N = 2e5 + 10; const int INF=0x3f3f3f3f; int n, m; int w[N]; int f[N]; int q[N]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> w[i]; int hh = 0, tt = -1; q[++tt] = 0; for (int i = 1; i <= n; i++) { if (q[hh] < i - m) hh++; f[i] = f[q[hh]] + w[i]; while (hh <= tt && f[q[tt]] >= f[i]) tt--; q[++tt] = i; } int res=INF; for(int i=n-m+1;i<=n;i++) res=min(res,f[i]); cout<<res<<endl; return 0; }