题解:

先按照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]);
}

 

posted on 2018-04-15 20:20  宣毅鸣  阅读(136)  评论(0编辑  收藏  举报