每日一题 day29 打卡

Analysis

朴素的DP方程为: dp[i]=max{sum[i]-sum[j-1]};

对于每个i 需要用单调队列维护最小的sum[j-1]

注意:

1.tail初值要置成1,因为i=1时状态要从i=0转移,所以队列中已有一个元素0。

2.对于每个i,要先维护队头,因为j !=i,所以i不会从i转移。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 #define maxn 200000+10
 7 #define INF 9223372036854775807
 8 using namespace std;
 9 inline int read()
10 {
11     int x=0;
12     bool f=1;
13     char c=getchar();
14     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
15     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
16     if(f) return x;
17     return 0-x;
18 }
19 inline void write(int x)
20 {
21     if(x<0){putchar('-');x=-x;}
22     if(x>9)write(x/10);
23     putchar(x%10+'0');
24 }
25 int n,m;
26 int a[maxn],sum[maxn],deque[maxn],deque_num[maxn];
27 signed main()
28 {
29     n=read();m=read();
30     for(int i=1;i<=n;i++)
31     {
32         a[i]=read();
33         sum[i]=sum[i-1]+a[i];
34     }
35     int head=1,tail=1,ans=-INF;
36     for(int i=1;i<=n;i++)
37     {
38         while(head<=tail&&deque_num[head]<i-m) head++;
39         ans=max(ans,sum[i]-deque[head]);
40         while(head<=tail&&deque[tail]>=sum[i]) tail--;
41         deque[++tail]=sum[i];
42         deque_num[tail]=i;
43     }
44     write(ans);
45     return 0;
46 }

请各位大佬斧正

01-07 04:16