最小费用最大流。
模型不要再明显点,简直裸题。
不多说了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf=1e9;
struct Edge{int from,to,next,v,c;}e[50005];
int head[105],d[105],from[105],cnt=1;
bool inq[105];
void ins(int u,int v,int w,int c){
cnt++;e[cnt].from=u;e[cnt].to=v;
e[cnt].next=head[u];head[u]=cnt;
e[cnt].v=w;e[cnt].c=c;
}
void insert(int u,int v,int w,int c){
ins(u,v,w,c);ins(v,u,0,-c);
}
bool spfa(int s,int t,int &cost){
memset(d,0x3f,sizeof(d));
queue<int>q;q.push(s);d[s]=0;
while(!q.empty()){
int u=q.front();q.pop();
inq[u]=false;
for(int i=head[u];i;i=e[i].next)
if(e[i].v&&d[e[i].to]>d[u]+e[i].c){
d[e[i].to]=d[u]+e[i].c;
from[e[i].to]=i;
if(!inq[e[i].to]){inq[e[i].to]=true;q.push(e[i].to);}
}
}
if(d[t]>=inf)return false;
int x=inf;
for(int i=from[t];i;i=from[e[i].from])x=min(x,e[i].v);
for(int i=from[t];i;i=from[e[i].from]){
e[i].v-=x;e[i^1].v+=x;cost+=x*e[i].c;
}
return true;
}
int mcmf(int s,int t){int cost=0;while(spfa(s,t,cost));return cost;}
int main(){
int n,m,s;scanf("%d%d%d",&n,&m,&s);
int S=0,T=n+1;
for(int i=1;i<=n;i++){
int u;scanf("%d",&u);
insert(i,T,u,0);
if(i!=n)insert(i,i+1,s,m);
}
for(int i=1;i<=n;i++){
int c;scanf("%d",&c);
insert(S,i,inf,c);
}
printf("%d",mcmf(S,T));
return 0;
}