题解:
先按照pos排序
我们考虑每个船的结束为止endi
endi-len[i]+1>=pos[i-1],end[i]>=pos[i],end[i]<pos[i+1]
显然每一个位置的endi唯一
所以就可以dp了
代码:
#include<bits/stdc++.h> using namespace std; const int N=100005; int n,sum[N],x,m,a[N],pos[N],len[N],s[N],f[N]; int cmp(int x,int y) { return pos[x]<pos[y]; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++)scanf("%d",&x),sum[i]=sum[i-1]+x; scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%d%d",&pos[i],&len[i]); f[i]=i; } sort(f+1,f+m+1,cmp); f[m+1]=m+1; pos[f[m+1]]=n+1; for (int i=1;i<=m;i++) for (int j=pos[f[i]];j-pos[f[i]]+1<=len[f[i]]&&j<pos[f[i+1]];j++) if (j-len[f[i]]+1>pos[f[i-1]])a[j]=f[i]; for (int i=1;i<=n;i++) { s[i]=s[i-1]; if (a[i])s[i]=max(s[i],s[i-len[a[i]]]+sum[i]-sum[i-len[a[i]]]); } printf("%d",s[n]); }