codeforces|CF13C Sequence
2024-10-20 16:37:13
大概的题意就是每次可以对一个数加一或者减一,然后用最小的代价使得原序列变成不下降的序列。
因为是最小的代价,所以到最后的序列中的每个数字肯定在原先的序列中出现过。(大家可以想一下到底是为什么,或者简单举几个例子验证一下)
我们用一个c数组拷贝原先的a数组,然后进行从小到大排序。
那么之后我们考虑DP,因为是5000的数据,考虑\(n^2\)做法。设\(dp[i][j]\)表示前i个已经符合要求,而且最大数不大于原序列第j个元素最小需要的代价。
那么我们可以得出转移方程\(dp[i][j]=min(dp[i][j-1],dp[i-1][j]+abs(a[i]-c[j])\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 5010
using namespace std;
int n;
long long ans=(long long)1e18;
long long a[MAXN],c[MAXN],dp[2][MAXN];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
memcpy(c,a,sizeof(a));
sort(&c[1],&c[n+1]);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++) dp[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dp[1][j]=min(dp[1][j-1],dp[0][j]+abs(a[i]-c[j]));
swap(dp[1],dp[0]);
}
for(int i=1;i<=n;i++) ans=min(ans,dp[0][i]);
cout<<ans<<endl;
return 0;
}
最新文章
- JDK常用工具集&mdash;&mdash;jps
- 【zz】MIT牛人解说数学体系
- 更改Photoshop 语言为英语(无需语言包)
- 我也说百度和google
- SqlSever基础 union 联合查询,厉害的并集 重复项只显示一个 两个查询结果并在一起后排序
- js种的循环语句
- Python的数据处理学习(三)
- 架构探险——第二章(为web应用添加业务功能)
- Qt之文件操作 QFile
- cacti监控部署与配置
- <;锋利的jQuery>;读书笔记
- sqlserver 分割字符串和调用
- 大数据项目测试<;二>;项目的测试工作
- 20171018 在小程序页面去获取用户的OpenID
- 第43章 RTC—实时时钟
- app流畅度测试--使用FPS Meter
- 读写csv文件——考虑各种异常场景,源码
- 【ArcGIS for Android】经纬度坐标、地图投影坐标、屏幕坐标互相转换
- 代码编写规范Asp.Net(c#)
- Python爬虫学习笔记之抓取猫眼的排行榜