【题目链接】 http://codeforces.com/problemset/problem/724/E
【题目大意】
每个城市有pi的物品可以运出去卖,si个物品可以买,
编号小的城市可以往编号大的城市最多运送c的物品,问最多有多少物品可以被买卖
【题解】
源点向每个城市引pi的流,每个城市向汇点引si的流,
小编号的城市往大编号的城市引c的流,那么全图的最大流就是答案,
但是数据量过大,我们考虑转化。
因为最大流等于最小割,我们发现对于这个图,最后每个点不是跟s连就是跟t连,
那么我们设dp[i][j]表示前i个城市j个城市与s连接的最小割,dp一遍即可得到答案。
【代码】
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int N=10010; int n; LL c,p[N],s[N],dp[N],ans; int main(){ while(~scanf("%d%lld",&n,&c)){ for(int i=1;i<=n;i++)scanf("%lld",&p[i]); for(int i=1;i<=n;i++)scanf("%lld",&s[i]); memset(dp,0x3f,sizeof(dp));dp[0]=0; for(int i=1;i<=n;i++){ for(int j=i;j;j--)dp[j]=min(dp[j]+j*c+p[i],dp[j-1]+s[i]); dp[0]+=p[i]; }ans=0x3f3f3f3f3f3f3f3f; for(int i=0;i<=n;i++)ans=min(ans,dp[i]); printf("%lld ",ans); }return 0; }