题解:
先按照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=;
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=;i<=n;i++)scanf("%d",&x),sum[i]=sum[i-]+x;
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&pos[i],&len[i]);
f[i]=i;
}
sort(f+,f+m+,cmp);
f[m+]=m+;
pos[f[m+]]=n+;
for (int i=;i<=m;i++)
for (int j=pos[f[i]];j-pos[f[i]]+<=len[f[i]]&&j<pos[f[i+]];j++)
if (j-len[f[i]]+>pos[f[i-]])a[j]=f[i];
for (int i=;i<=n;i++)
{
s[i]=s[i-];
if (a[i])s[i]=max(s[i],s[i-len[a[i]]]+sum[i]-sum[i-len[a[i]]]);
}
printf("%d",s[n]);
}