题目:http://poj.org/problem?id=3666

dp方程可以是 d [ i ] [ j ] = min ( d [ i - 1 ] [ k ] ) + abs ( a [ i ] - j ),表示a数组前 i 个与结尾为 j 的 b 数组匹配的最优解。0<=k<=j。

可以证明 b 数组中的数都在 a 数组中出现过。详见《算法竞赛进阶指南》。

所以 j 可以表示a [ j ]。当然为了满足不降或不升,需要复制下a数组再排个序来用。

n^2是 LICS 的套路。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const long long INF=0x7fffffff;
int n;
long long a[2005],b[2005],d[2005][2005],ans=INF;
bool cmp(long long x,long long y)
{return x>y;
}
long long as(long long k)
{return k<0?-k:k;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);memcpy(b,a,sizeof a);sort(b+1,b+n+1);for(int i=1;i<=n;i++){int k=1;
//        printf("i=%d\n",i);for(int j=1;j<=n;j++){
//            printf(" j=%lld ",b[j]);k=d[i-1][j]<d[i-1][k]?j:k;
//            printf("k=%lld d[i-1][k]=%lld ",b[k],d[i-1][k]);d[i][j]=d[i-1][k]+as(a[i]-b[j]);
//            printf("d=%lld\n",d[i][j]);
        }}for(int i=1;i<=n;i++)ans=min(ans,d[n][i]);sort(b+1,b+n+1,cmp);memset(d,0,sizeof d);for(int i=1;i<=n;i++){int k=1;
//        printf("i=%d\n",i);for(int j=1;j<=n;j++){
//            printf(" j=%lld ",b[j]);k=d[i-1][j]<d[i-1][k]?j:k;
//            printf("k=%lld d[i-1][k]=%lld ",b[k],d[i-1][k]);d[i][j]=d[i-1][k]+as(a[i]-b[j]);
//            printf("d=%lld\n",d[i][j]);
        }}for(int i=1;i<=n;i++)ans=min(ans,d[n][i]);printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/8563712.html

POJ3666序列最小差值相关推荐

  1. CCF201712-1 最小差值(100分)【序列处理】

    试题编号: 201712-1 试题名称: 最小差值 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值 ...

  2. LeetCode简单题之学生分数的最小差值

    题目 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最 ...

  3. mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  4. 算法--06年华为面试:求两个数组的最小差值(Java实现)

    Q题目 华为06年面试题(要求8分钟完成) 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. A解法 1.常见错误逻 ...

  5. 算法--微软面试题:求一个整数数组元素间最小差值

    Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. A解法 方案一:最愚笨的办法--暴力穷举 利用数组中所有数据两两相减的对比来求出这个最小差值. ...

  6. 「 每日一练,快乐水题 」1984. 学生分数的最小差值

    ✅力扣原题: 力扣链接:1984. 学生分数的最小差值 ✅题目简述: 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组 ...

  7. 1984. 学生分数的最小差值

    1984. 学生分数的最小差值 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k ...

  8. leetcode910. 最小差值 II(贪心)

    给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...

  9. 《Python Cookbook 3rd》笔记(4.10):序列上索引值迭代

    序列上索引值迭代 问题 你想在迭代一个序列的同时跟踪正在被处理的元素索引. 解法 内置的 enumerate() 函数可以很好的解决这个问题: >>> my_list = ['a', ...

最新文章

  1. python音频聚类_利用python的KMeans和PCA包实现聚类算法
  2. oracle12c em 空白,Oracle12C 开启关闭em
  3. Oracle 数据恢复指导具体解释
  4. MySQL / 多版本并发控制
  5. LeetCode 58 Spiral Matrix II
  6. Android ListView 实现下拉刷新上拉加载
  7. 【工具类】使用ffmpeg下载视频
  8. 图书管理 python excel_爬取python异步社区图书并写入excel
  9. error c2471: cannot update program database vc90.pdb-小楼一夜听春雨-博客园
  10. java js css 压缩工具_JSCSS压缩工具YUICompressor
  11. 小学三年级上册计算机计划书,小学生计划书
  12. FrameMaker从零到学习编码
  13. java计算机毕业设计校园订餐系统源代码+数据库+系统+lw文档
  14. 【经验】不摸鱼的时光
  15. 计算机毕业设计(附源码)python自助旅游平台
  16. 1042 Shuffling Machine (20 point(s)) - C语言 PAT 甲级
  17. 使用asan检测内存泄漏、堆栈溢出等问题
  18. 请问有什么控件可以方便的实现呢
  19. Elasticsearch集成SpringBoot
  20. 操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481

热门文章

  1. ceph-deploy install时,远端节点在执行apt-get update命令时失败
  2. memcached 安装小结-1
  3. 高端企业级存储IBM XIV访谈视频
  4. Android简单调用相机Camera功能,实现打开照相功能
  5. SVD(奇异值分解)Python实现
  6. 【learning】快速沃尔什变换FWT
  7. Angular JS 中的内置方法之$watch
  8. Filter,FilterChain,FilterConfig
  9. SpringBoot使用velocity模板引擎
  10. HTC G7 金卡 制作