读题堪忧啊,敲完了才发现理解错了。。理解题必须看样例啊!!


题目链接:

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#problem/S

题意:

给定序列,做出最少的改变,使得新的序列单调非增或者或单调非减。

分析:

先考虑单调非增。

如果后一个元素比前一个小,那么最少改变的情况就是让他和前一个元素相等。如果比前一个元素大或者相等,则不需做出改变。

仔细想想就可以发现其实最后的序列就是由原始数组的元素组成。

那么我们先对原始数组排个序,

设dp[i][j]为考虑第i个位置,放排序后的第j个元素的改变量。

最初按照二维想的,然后直接压缩成一维的。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define sa(a) scanf("%d", &a)
#define sal(a) scanf("%I64d", &a)
const int maxn = 2000 + 5, INF = 0x3f3f3f3f;
int a[maxn], na[maxn];
long long dp[maxn];
int main (void)
{
int n;sa(n);
for(int i = 0; i < n; i++) {
sa(a[i]);na[i] = a[i];}
sort(na, na + n);
memset(dp, 0x3f, sizeof(dp));
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
dp[j] = min(dp[j], dp[j - 1] + abs(a[j] - na[i]));
}
}
long long ans = dp[n - 1];
memset(dp, 0x3f, sizeof(dp));
for(int i = n - 1; i >= 0; i--){
for(int j = 0; j < n; j++){
dp[j] = min(dp[j], dp[j - 1] + abs(a[j] - na[i]));
}
}
printf("%I64d\n",min(ans, dp[n - 1]));
return 0;
}

最新文章

  1. mysql 添加用户并授权
  2. 【转】如何确定Kafka的分区数、key和consumer线程数
  3. Problems running django-admin
  4. 深入Mysql 导入导出
  5. GB2312 简体中文编码表
  6. Java基础知识强化之IO流笔记05:try...catch...finally包含的代码是运行期的
  7. g++ error: expected ‘)’ before ‘*’ token
  8. 2014第3周六升级win8.1
  9. elasticsearch的javaAPI之query
  10. OCA读书笔记(16) - 执行数据库恢复
  11. 【Unity与23种设计模式】解释器模式(Interpreter)
  12. 深入理解Java虚拟机阅读心得(一)
  13. AGC027 B - Garbage Collector 枚举/贪心
  14. 第二阶段——个人工作总结DAY01
  15. Hive Tunning(三) 最佳实践
  16. [转]win server 2003 + IIS 6 搭建MVC 运行环境
  17. Linux命令-目录处理命令:ls
  18. [转]C#在WinForm下使用HttpWebRequest上传文件并显示进度
  19. hdu2112HDU Today(floyd+map数组对字符串的应用)
  20. 第15章—数据库连接池(DBCP2)

热门文章

  1. RecycleView的万能适配器
  2. web页面调用IOS的事件
  3. AIX 11203 ASM RAC安装
  4. PHP23 AJAX分页
  5. Spring-02 Java配置实现IOC
  6. CreateProcess相关
  7. 牛客网数据库SQL实战 1-11
  8. python解决鸡兔同笼问题
  9. java面试微信交流群-欢迎你的加入
  10. 如何用纯 CSS 绘制一颗闪闪发光的璀璨钻石