POJ3666序列最小差值
题目: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序列最小差值相关推荐
- CCF201712-1 最小差值(100分)【序列处理】
试题编号: 201712-1 试题名称: 最小差值 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值 ...
- LeetCode简单题之学生分数的最小差值
题目 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最 ...
- mysql获取两个表中日期字段的最小差值
一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...
- 算法--06年华为面试:求两个数组的最小差值(Java实现)
Q题目 华为06年面试题(要求8分钟完成) 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. A解法 1.常见错误逻 ...
- 算法--微软面试题:求一个整数数组元素间最小差值
Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. A解法 方案一:最愚笨的办法--暴力穷举 利用数组中所有数据两两相减的对比来求出这个最小差值. ...
- 「 每日一练,快乐水题 」1984. 学生分数的最小差值
✅力扣原题: 力扣链接:1984. 学生分数的最小差值 ✅题目简述: 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组 ...
- 1984. 学生分数的最小差值
1984. 学生分数的最小差值 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整数 k . 从数组中选出任意 k 名学生的分数,使这 k ...
- leetcode910. 最小差值 II(贪心)
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B 的最小值之间 ...
- 《Python Cookbook 3rd》笔记(4.10):序列上索引值迭代
序列上索引值迭代 问题 你想在迭代一个序列的同时跟踪正在被处理的元素索引. 解法 内置的 enumerate() 函数可以很好的解决这个问题: >>> my_list = ['a', ...
最新文章
- python音频聚类_利用python的KMeans和PCA包实现聚类算法
- oracle12c em 空白,Oracle12C 开启关闭em
- Oracle 数据恢复指导具体解释
- MySQL / 多版本并发控制
- LeetCode 58 Spiral Matrix II
- Android ListView 实现下拉刷新上拉加载
- 【工具类】使用ffmpeg下载视频
- 图书管理 python excel_爬取python异步社区图书并写入excel
- error c2471: cannot update program database vc90.pdb-小楼一夜听春雨-博客园
- java js css 压缩工具_JSCSS压缩工具YUICompressor
- 小学三年级上册计算机计划书,小学生计划书
- FrameMaker从零到学习编码
- java计算机毕业设计校园订餐系统源代码+数据库+系统+lw文档
- 【经验】不摸鱼的时光
- 计算机毕业设计(附源码)python自助旅游平台
- 1042 Shuffling Machine (20 point(s)) - C语言 PAT 甲级
- 使用asan检测内存泄漏、堆栈溢出等问题
- 请问有什么控件可以方便的实现呢
- Elasticsearch集成SpringBoot
- 操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481