Yet Another Minimization Problem(CF1637D)
You are given two arrays and , both of length .
You can perform the following operation any number of times (possibly zero): select an index ( ) and swap and .
Let's define the cost of the array as . Similarly, the cost of the array is .
Your task is to minimize the total cost of two arrays.
由题意可知,要求的值是在将任意的 与 交换的前提下,最小的
那么,由该式可以推出
可以发现其中的 是作为一个定值出现的,所以我们只需要将 最小化即可。
这一点,利用动规解决。
在由第 个状态向第 个状态转移的时候,我们无法确定的是 和 的值(因为其中可能存在交换)。
那么因为考虑到 的值并不大,所以可以将 加入状态。
又因为交换的为 与 ,可以发现在相同范围内的区间和的和(即 )也是一个定值,那么就可以求出对应的 的区间的和。
此时,我们设计状态为 表示为考虑前 位, 时的最小值,
那么对于状态的转移,
令 的值。
- 如果 与 不进行交换,那么此时的
则状态转移为
- 如果 与 进行交换,那么此时的
则状态转移为(此时的 与 交换)
void solve() {
ans=minn=0;
memset(f,0x7f7f7f,sizeof(f));
f[0][0]=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {
cin>>b[i];
k[i]=k[i-1]+max(a[i],b[i]);
sum[i]=sum[i-1]+a[i]+b[i];
ans+=a[i]*a[i]+b[i]*b[i];
}
ans*=(n-1);
for(int i=1;i<=n;i++) {
for(int j=1;j<=k[i];j++) {
if (j-a[i]>=0 && sum[i-1]-j+a[i]>=0) {
f[i][j]=min(f[i][j],f[i-1][j-a[i]]+a[i]*(j-a[i])+b[i]*(sum[i-1]-j+a[i]));
}
if (j-b[i]>=0 && sum[i-1]-j+b[i]>=0){
f[i][j]=min(f[i][j],f[i-1][j-b[i]]+b[i]*(j-b[i])+a[i]*(sum[i-1]-j+b[i]));
}
}
}
minn=1e9+7;
for(int j=1;j<=k[n];j++){
minn=min(minn,f[n][j]);
}
cout<<ans+2*minn<<'\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】