题目: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[],b[],d[][],ans=INF;
bool cmp(long long x,long long y)
{
return x>y;
}
long long as(long long k)
{
return k<?-k:k;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
memcpy(b,a,sizeof a);
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
int k=;
// printf("i=%d\n",i);
for(int j=;j<=n;j++)
{
// printf(" j=%lld ",b[j]);
k=d[i-][j]<d[i-][k]?j:k;
// printf("k=%lld d[i-1][k]=%lld ",b[k],d[i-1][k]);
d[i][j]=d[i-][k]+as(a[i]-b[j]);
// printf("d=%lld\n",d[i][j]);
}
}
for(int i=;i<=n;i++)
ans=min(ans,d[n][i]);
sort(b+,b+n+,cmp);
memset(d,,sizeof d);
for(int i=;i<=n;i++)
{
int k=;
// printf("i=%d\n",i);
for(int j=;j<=n;j++)
{
// printf(" j=%lld ",b[j]);
k=d[i-][j]<d[i-][k]?j:k;
// printf("k=%lld d[i-1][k]=%lld ",b[k],d[i-1][k]);
d[i][j]=d[i-][k]+as(a[i]-b[j]);
// printf("d=%lld\n",d[i][j]);
}
}
for(int i=;i<=n;i++)
ans=min(ans,d[n][i]);
printf("%lld",ans);
return ;
}

POJ3666序列最小差值的更多相关文章

  1. 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

    32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...

  2. LuoguP4234_最小差值生成树_LCT

    LuoguP4234_最小差值生成树_LCT 题意: 给出一个无向图,求最大的边权减最小的边权最小的一棵生成树. 分析: 可以把边权从大到小排序,然后类似魔法森林那样插入. 如果两点不连通,直接连上, ...

  3. [Swift]LeetCode908. 最小差值 I | Smallest Range I

    Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...

  4. [Swift]LeetCode910. 最小差值 II | Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  5. CCF CSP 201712-1 最小差值

    题目链接:http://118.190.20.162/view.page?gpid=T68 问题描述 试题编号: 201712-1 试题名称: 最小差值 时间限制: 1.0s 内存限制: 256.0M ...

  6. 2018-计算机系机试(第二批)-D-最小差值

    单点时限: 2.0 sec 内存限制: 256 MB 输入 n 个整数,输出最小差值.最小差值指所有数之间差的绝对值的最小数. 例如:3 个整数 1,2 和 6 的最小差值是 1. 输入格式 第一个数 ...

  7. leetcode-908-最小差值 I

    题目描述: 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回  ...

  8. [luogu4234]最小差值生成树

    [luogu4234]最小差值生成树 luogu 从小到大枚举边,并连接,如果已连通就删掉路径上最小边 lct维护 \(ans=min(E_{max}-E_{min})\) #include<b ...

  9. CCF201712-1 最小差值

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

随机推荐

  1. currentSession

    public  class  HibernateUtil  {  public static final ThreadLocal session =new ThreadLocal();  public ...

  2. httpclient 使用代理

    httpclient_使用代理 当爬取网页的时候,有的目标站点有反爬虫机制,对于频繁访问站点以及规则性访问站点的行为,会采用屏蔽IP的措施. 这时候代理IP就派上用场了. 代理的分类 透明代理 匿名代 ...

  3. kernel jenkins build script

    #!/bin/bash #gcc: site="https://releases.linaro.org" #https://releases.linaro.org/componen ...

  4. 一个Flex 对话框的坑

    最近在项目中遇到一个问题,在Flex中使用Alert.show("this is content!", "title");发现对话框可以弹出来,但是文本始终不显 ...

  5. Oracle Rman 增量备份与差异备份

    一.增量与差异 关于Incremental增量备份级别: Oracle 9i 共有五种级别 0 1 2 3 4,0级最高-4级最低,0级是1级的基础以此类推. Oracle 10g官方文档明确指出增量 ...

  6. Ubuntu中使用WPS

    ubunu系统下用WPS办公软件比较好,比较兼容MS office, ubuntu下WPS相关命令有:et,wps,wpp. 使用Ctrl+Alt+T打开命令端, "et"命令可以 ...

  7. jquery ajax 无法跨域调用的解决办法

    今天要用到jquery ajax 跨域调用,但是ajax是禁止跨域调用的,所以只能先在php文件使用函数取得跨域的值,然后用ajax调用本地php文件.

  8. L1-036 A乘以B

    看我没骗你吧 —— 这是一道你可以在 10 秒内完成的题:给定两个绝对值不超过 100 的整数 A 和 B,输出 A 乘以 B 的值. 输入格式: 输入在第一行给出两个整数 A 和 B(−100≤A, ...

  9. 用MyEclipse JPA创建项目(二)

    MyEclipse 3.15 Style——在线购买低至75折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于PA的功能. 阅读本教程时,了解J ...

  10. <二叉树的基本操作>

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK ...