题目链接
首先容易建出最大流的图,但边数是
O
(
n
2
)
O(n^{2})
O(n2)级别的,且每对
i
<
j
i<j
i<j之间都有连边,难以用数据结构优化。考虑转化为等价的最小割问题,发现割边只有每个点与
s
,
t
s,t
s,t点相连的边以及
s
s
s集合到
t
t
t集合的边,可直接DP,设
f
[
i
]
[
j
]
f[i][j]
f[i][j]为前
i
i
i个点有
j
j
j个属于
s
s
s集合,转移显然。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10005; const ll F=1e18;
int n; ll s[N],t[N],c,f[2][N],ans=F;
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>c;
for(int i=1;i<=n;i++) scanf("%lld",&s[i]);
for(int i=1;i<=n;i++) scanf("%lld",&t[i]);
for(int i=0;i<2;i++) for(int j=0;j<=n;j++) f[i][j]=F;
f[0][0]=0;
for(int i=1;i<=n;i++){
int x=(i&1);
for(int j=0;j<=i;j++){
f[x][j]=f[!x][j]+s[i]+c*j;
if(j) f[x][j]=min(f[x][j],f[!x][j-1]+t[i]);
if(i==n) ans=min(ans,f[x][j]);
}
}
cout<<ans<<endl;
return 0;
}