RT,只A了#1和#6
#include<bits/stdc++.h>
using namespace std;
long long cnt;
long long head[5001];
long long dis[5001];
long long pre[5001];
const long long inf=INT_MAX;
bool vis[5001];
long long n,m;
struct node
{
long long to,nxt;
long long cap,flow;
long long cost;
}edge[1000001];
long long mxflo;
long long mncos;
void add(long long u,long long v,long long w,long long c)
{
edge[cnt].to=v;
edge[cnt].cap=w;
edge[cnt].flow=0;
edge[cnt].cost=c;
edge[cnt].nxt=head[u];
head[u]=cnt++;
}
void adde(long long u,long long v,long long w,long long c)
{
//cout<<u<<" -> "<<v<<endl;
add(u,v,w,c);
add(v,u,0,-c);
}
bool spfa(long long s,long long t)
{
memset(vis,false,sizeof(vis));
memset(pre,-1,sizeof(pre));
memset(dis,0x3f,sizeof(dis));
queue<long long>q;
vis[s]=true;
dis[s]=0;
q.push(s);
while(!q.empty())
{
long long u=q.front();
q.pop();
vis[u]=false;
for(long long i=head[u];~i;i=edge[i].nxt)
{
long long v=edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost)
{
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v])
{
q.push(v);
vis[v]=true;
}
}
}
}
return pre[t]!=-1;
}
void mcmf(long long s,long long t)
{
long long d=0;
while(spfa(s,t))
{
d=1e18;
for(long long i=pre[t];~i;i=pre[edge[i^1].to])
d=min(d,edge[i].cap-edge[i].flow);
for(long long i=pre[t];~i;i=pre[edge[i^1].to])
{
edge[i].flow+=d;
edge[i^1].flow-=d;
}
mxflo+=d;
mncos+=dis[t]*d;
}
}
signed main()
{
//freopen("P1251_2.in","r",stdin);
//1 -> 2-3 -> 4-5 -> 6-7 -> 8
//0 1 2 3 4
memset(head,-1,sizeof(head));
long long st,ed,N;
long long p,m,f,n,s;
long long a[4001];
cin>>N;
for(long long i=1;i<=N;i++)
{
cin>>a[i];
}
cin>>p>>m>>f>>n>>s;
st=1;
ed=n*2+2;
for(long long i=1;i<=N;i++)
{
adde(st,i*2+1,a[i],0);
adde(i*2,ed,a[i],0);
}
for(long long i=1;i<=N;i++)
{
if(i+1<=N) adde(i*2+1,i*2+3,inf,0);
if(i+m<=N) adde(i*2+1,(i+m)*2,inf,f);
if(i+n<=N) adde(i*2+1,(i+n)*2,inf,s);
adde(st,i*2,inf,p);
}
mcmf(st,ed);
cout<<mncos;
}