样例过不去 输出95 调吐了已经
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=4010;
const int inf=2147483647;
struct node{
int to,next,flow,cost;
}edge[M<<1];
int head[M],cnte=1;
void add(int u,int v,int w,int c){
edge[++cnte].to=v;
edge[cnte].flow=w;
edge[cnte].cost=c;
edge[cnte].next=head[u];
head[u]=cnte;
edge[++cnte].to=u;
edge[cnte].flow=0;
edge[cnte].cost=-c;
edge[cnte].next=head[v];
head[v]=cnte;
}
int n,s,t,Wnew,Tfast,Wfast,Tslow,Wslow;
int dis[M],incf[M],pre[M];
bool vis[M];
bool SPFA(){
for(int i=0;i<M;i++) dis[i]=inf;
for(int i=0;i<M;i++) vis[i]=false;
queue<int>q;q.push(s);
dis[s]=0,vis[s]=true;
incf[s]=inf;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=false;
for(int i=head[u];~i;i=edge[i].next){
if(edge[i].flow<=0) continue;
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].cost){
pre[v]=i;
dis[v]=dis[u]+edge[i].cost;
incf[v]=min(incf[u],edge[i].flow);
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(dis[t]==inf) return false;
return true;
}
int MCMF(){
int mincost=0;
while(SPFA()){
mincost+=dis[t]*incf[t];
int cur=t;
while(cur!=s){
int i=pre[cur];
edge[i].flow-=incf[t],edge[i^1].flow+=incf[t];
cur=edge[i^1].to;
}
}
return mincost;
}
int a[M];
int main(){
memset(head,-1,sizeof head);
scanf("%d",&n),s=0,t=(n<<1)+1;
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
add(s,i,x,0),add(i+n,t,x,0);
}
scanf("%d%d%d%d%d",&Wnew,&Wfast,&Tfast,&Wslow,&Tslow);
for(int i=1;i<=n;i++){
add(s,i+n,inf,Wnew);
if(i+1<=n) add(i,i+1,inf,0);
if(i+Tfast<=n) add(i,i+Tfast+n,inf,Wfast);
if(i+Tslow<=n) add(i,i+Tslow+n,inf,Wslow);
}
printf("%d",MCMF());
return 0;
}