[题解]CF13C Sequence

CF13C Sequence

给定\(N\)个数,每次操作可以选其中一个数\(+1\)\(-1\)。请问要让这个数列不降,最少需要多少次操作?

我们用DP解决。

\(a\)从小到大排序,存在\(c\)中。

我们用\(f[i][j]\)表示让前\(i\)个元素满足条件,而且这些元素最大值不超过\(c[j]\)的最小操作次数。

状态转移方程:\(f[i][j]=\min(f[i][j-1],f[i-1][j]+abs(a[i]-c[j]))\)

最终答案就是\(\min(f[n][i])\)

时间复杂度\(O(n^2)\)

注意

  • 空间限制64MB,需要滚动数组。
  • long long
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[5010],b[5010];
int f[2][5010];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n);
f[0][0]=f[1][0]=LLONG_MAX;
bool pos=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[pos][j]=min(f[pos][j-1],f[!pos][j]+abs(a[i]-b[j]));
}
pos=!pos;
}
int ans=LLONG_MAX;
for(int i=1;i<=n;i++){
ans=min(ans,f[!pos][i]);
}
cout<<ans;
return 0;
}

附:加强版P4597 序列 sequence ~ 题解

posted @   Sinktank  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2025-3-6 6:10:35 TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2024 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.
点击右上角即可分享
微信分享提示