**格式**:max 使用 \max,sum 使用 \text{sum},代码使用 '''' 隐藏,均已修改。学会使用 ''\begin{cases}\end{cases}'' 来表示不同的 case,不需要自己设计格式。 **内容**:内容过于简单!可尝试从读者的角度想想能否看懂。 - 动态转移方程 -> 状态转移方程 - $(1\le j k \end{cases} $$ 答案为 $\text{ans}=\max\{dp[i]\}$。 但是时间复杂度为 $O(nk)$,显然会超时。 注意到 $\text{sum}[i]$ 可以直接提出,即 $dp[i]=\max\{dp[j]\}+\text{sum}[i]$,所以我们只需用一个单调队列来维护 $dp[i]$ 的最值,复杂度可以降低为 $O(n)$。 #include #include using namespace std; int n,k; long long e[100001]; long long dp[100001]; long long sum[100001]; int q[100001]; int front=0,tail=1; long long a(int now) { return dp[now-1]-sum[now]; } int main() { scanf("%d %d",&n,&k); int rec=0; for (int i=1;i<=n;i++) { scanf("%lld",&e[i]); sum[i]=sum[i-1]+e[i]; } for (int i=1;i<=n;i++) { while (front<=tail&&q[front] ==== 练习 ==== [[https://www.luogu.com.cn/problem/solution/P3957|洛谷p3957]]