点击这里查看原题
建议看这里http://www.acyume.com/archives/1069
/*
User:Small
Language:C++
Problem No.:1221
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int N=2005,M=20005;
int n,a,b,f,fa,fb,fir[N],tot=1,ans,dis[N];
bool vis[N];
struct edge{
int v,w,c,nex;
}e[M];
void add(int u,int v,int w,int c){
e[++tot]=(edge){v,w,c,fir[u]};
fir[u]=tot;
e[++tot]=(edge){u,0,-c,fir[v]};
fir[v]=tot;
}
bool spfa(int s,int t){
memset(vis,0,sizeof(vis));
memset(dis,127,sizeof(dis));
dis[t]=0;
vis[t]=1;
queue<int> q;
q.push(t);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=fir[u];i;i=e[i].nex){
int v=e[i].v;
if(e[i^1].w&&dis[v]>dis[u]+e[i^1].c){
dis[v]=dis[u]+e[i^1].c;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
return dis[s]<inf;
}
int dfs(int u,int f,int t){
vis[u]=1;
if(u==t) return f;
int sum=0;
for(int i=fir[u];i;i=e[i].nex){
int v=e[i].v;
if(!vis[v]&&e[i].w&&dis[v]+e[i].c==dis[u]){
int d=dfs(v,min(f,e[i].w),t);
ans+=d*e[i].c;
e[i].w-=d;
e[i^1].w+=d;
f-=d;
sum+=d;
if(!f) return sum;
}
}
return sum;
}
void zkw(int s,int t){
while(spfa(s,t)){
vis[t]=1;
while(vis[t]){
memset(vis,0,sizeof(vis));
dfs(s,inf,t);
}
}
}
int main(){
freopen("data.in","r",stdin);//
scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
add(1,i+n+2,inf,f);
add(1,i+2,x,0);
add(i+2+n,2,x,0);
if(i+a+1<=n) add(i+2,i+n+3+a,inf,fa);
if(i+b+1<=n) add(i+2,i+n+3+b,inf,fb);
if(i<n) add(i+2,i+3,inf,0);
}
zkw(1,2);
printf("%d\n",ans);
return 0;
}