CF724E Goods transportation 题解
有显然的网络流模型:选定源点与汇点,从源点向每一个点 连一条流量为 的边,从每个点 向汇点连一条流量为 的边,每一个点连向编号比它大的节点,流量为 ,之后求最大流即可。
可惜的是由于数据范围过大这样的最大流解法会被卡掉。想到最大流可以转化为最小割,所以转化为 DP 解决。设 为前 个节点中有 个与源点相连。
如果点 与源点相连,要割掉该点到汇点的边;如果点 与汇点相连,不仅要割掉源点到该点的边,还要把之前向外输出流量的点到该点的边割掉。
因此有状态转移方程:
空间复杂度过高,在实现中应当使用滚动数组。
View code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ri register int
#define il inline
const ll INF=0x7fffffffffff,N=1e5+10;
ll n,c,ans=INF;
ll p[N],s[N];
ll f[N][2];
il ll read(){
ll x=0,y=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')
y=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*y;
}
signed main(){
n=read(),c=read();
for(ri i=1;i<=n;i++)
p[i]=read();
for(ri i=1;i<=n;i++)
s[i]=read();
for(ri i=1;i<=n;i++)
f[i][1]=INF;
for(ri i=1;i<=n;i++){
f[0][0]=f[0][1]+p[i];
for(ri j=1;j<=i;j++)
f[j][0]=min(f[j-1][1]+s[i],f[j][1]+p[i]+c*j);
for(ri j=0;j<=i;j++)
f[j][1]=f[j][0];
}
for(ri i=0;i<=n;i++)
ans=min(ans,f[i][1]);
printf("%lld",ans);
return 0;
}
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
· 记一次 .NET 某发证机系统 崩溃分析
· 微服务架构学习与思考:SOA架构与微服务架构对比分析
· C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码)
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· dotnetty 新的篇章- 开源
· 设计模式:简单工厂、工厂方法与抽象工厂
· 用好 JUnit 5 的高级特性:提升单测效率和质量