大概的题意就是每次可以对一个数加一或者减一,然后用最小的代价使得原序列变成不下降的序列。

因为是最小的代价,所以到最后的序列中的每个数字肯定在原先的序列中出现过。(大家可以想一下到底是为什么,或者简单举几个例子验证一下)

我们用一个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;
}

最新文章

  1. JDK常用工具集&mdash;&mdash;jps
  2. 【zz】MIT牛人解说数学体系
  3. 更改Photoshop 语言为英语(无需语言包)
  4. 我也说百度和google
  5. SqlSever基础 union 联合查询,厉害的并集 重复项只显示一个 两个查询结果并在一起后排序
  6. js种的循环语句
  7. Python的数据处理学习(三)
  8. 架构探险——第二章(为web应用添加业务功能)
  9. Qt之文件操作 QFile
  10. cacti监控部署与配置
  11. &lt;锋利的jQuery&gt;读书笔记
  12. sqlserver 分割字符串和调用
  13. 大数据项目测试&lt;二&gt;项目的测试工作
  14. 20171018 在小程序页面去获取用户的OpenID
  15. 第43章 RTC—实时时钟
  16. app流畅度测试--使用FPS Meter
  17. 读写csv文件——考虑各种异常场景,源码
  18. 【ArcGIS for Android】经纬度坐标、地图投影坐标、屏幕坐标互相转换
  19. 代码编写规范Asp.Net(c#)
  20. Python爬虫学习笔记之抓取猫眼的排行榜

热门文章

  1. STL - Vector迭代器简单应用之计算元素和
  2. [iOS]UIScrollView嵌套内容在左右拨动的时候自动被顶上问题
  3. ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数
  4. Cassandra读写性能测试
  5. 01-MySQL优化大的思路
  6. Flume NG 配置详解
  7. Ubuntu设置屏幕分辨率
  8. Opencv 发现轮廓 findContours
  9. 安装操作系统CentOS-7.x
  10. sklearn中的随机森林