CF13C Sequence
嘟嘟嘟
偶然看到的这道题,觉得有点意思,就做了。
首先题里说修改后的数列只能出现修改前的数,那么状态之间的转移也就之可能在这些数之间。
令f[i][j]表示第 i 个数改成原序列第 j 小的数时的最小步数。容易得出:f[i][j] = min(f[i - 1][k]) + abs(a[i] - b[j]) (1 <= k <= j),其中a是原序列,b是排好序的序列。这样实现了一个O(n3)的dp。
然而n <= 5000,因此我们必须优化掉一层循环,考虑k那一层:f[i - 1][k]其实就是取前缀f[i - 1][j]中的最小值,令g[i][j]表示第 i 个数改成小于等于第 j 个数时的最小步数,那么g[i][j]可以用f[i][j]动态维护,有转移方程:
f[i][j] = g[i - 1][j] + abs(a[i] - b[j])
g[i][j] = f[i][j] (j = 1)
= min(g[i][j - 1], f[i][j]) (j > 1)
那么答案就是g[n][n]。
另外这道题限制64MB,因此空间上把第一维优化掉。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cctype> 4 using namespace std; 5 #define enter puts("") 6 #define space putchar(' ') 7 #define Mem(a, x) memset(a, x, sizeof(a)) 8 #define rg register 9 typedef long long ll; 10 typedef double db; 11 const int INF = 0x3f3f3f3f; 12 const db eps = 1e-8; 13 const int maxn = 5e3 + 5; 14 inline ll read() 15 { 16 ll ans = 0; 17 char ch = getchar(), las = ' '; 18 while(!isdigit(ch)) las = ch, ch = getchar(); 19 while(isdigit(ch)) ans = ans * 10 + ch - '0', ch = getchar(); 20 if(las == '-') ans = -ans; 21 return ans; 22 } 23 inline void write(ll x) 24 { 25 if(x < 0) putchar('-'), x = -x; 26 if(x >= 10) write(x / 10); 27 putchar(x % 10 + '0'); 28 } 29 30 int a[maxn], b[maxn], n; 31 ll f[maxn], g[maxn]; 32 33 int main() 34 { 35 n = read(); 36 for(int i = 1; i <= n; ++i) a[i] = b[i] = read(); 37 sort(b + 1, b + n + 1); 38 for(int i = 1; i <= n; ++i) 39 for(int j = 1; j <= n; ++j) 40 { 41 f[j] = g[j] + abs(a[i] - b[j]); 42 g[j] = j == 1 ? f[j] : min(g[j - 1], f[j]); 43 } 44 write(g[n]); enter; 45 return 0; 46 }
View Code
转载于:https://www.cnblogs.com/mrclr/p/9755273.html
CF13C Sequence相关推荐
- 【CodeForces】CF13C Sequence(配数学证明)
题目地址: https://www.luogu.com.cn/problem/CF13C 题面翻译: 给定一个序列,每次操作可以把某个数加111或者减111.要求把序列变成非降数列.而且要求修改后的数 ...
- cf13C Sequence(DP)
题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...
- Bi-LSTM-CRF for Sequence Labeling
做了一段时间的Sequence Labeling的工作,发现在NER任务上面,很多论文都采用LSTM-CRFs的结构.CRF在最后一层应用进来可以考虑到概率最大的最优label路径,可以提高指标. 一 ...
- Oracle 12C -- 基于sequence的列的默认值
12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...
- HDOJ-2062 :Subset sequence(DP)
题目:求子集序列 Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. A subset sequen ...
- Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的.它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小.由于这种特性(较小的相关性),它被广泛地用作各种无线 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- 【C++】C++11 STL算法(一):非修改序列操作(Non-modifying sequence operations)
目录 一.all_of.any_of.none_of: 1.官方说明 2.谓词 3.STL算法对谓词的说明 4.谓词的五种模式 5.all_of (C++ 11) 6.any_of (C++ 11) ...
最新文章
- java抽象的理解_Java中抽象类的理解
- html2Escape js 转义
- hadoop集群崩溃恢复记录
- 动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
- 使用DataWorks来调度AnalyticDB任务
- iscroll的使用
- MapReduce实现计数
- Java面试官:Kafka集群管理
- Word 中插入 C/C++ 代码(转)
- Widget改变大小
- sampro效果_SAM机架设置音乐/话筒/麦克风/输入和效果输出/添加VST插件/详细教程(附:SAM机架VST插件效果包下载)...
- 关于舵轮AGV 的数学模型
- 3K水稻SNP数据集的简单利用
- 2019银保监计算机类真题,2019中国银保监会招聘考试全真模拟卷(计算机类)
- java毕业设计鞍山丘比特房屋租赁管理系统Mybatis+系统+数据库+调试部署
- IOB Inside-outside-beginning (tagging)
- 华为无线网代理服务器端口是什么意思,华为ES1D2G48SFA0 48端口十兆/百兆/千兆以太网电接口板(FA,RJ45) (适用于华为S7700系列交换机)...
- DSPE-PEG-LyP-1(CGNKRTRGC)(二硬脂酰基磷脂酰乙醇胺-聚乙二醇-肿瘤靶向蛋白);肿瘤淋巴管归巢肽
- 系统架构设计师-总结说明
- matlab R2011a汉化包,MATLAB R2011a (7.12)发布了,MATLAB R2011a最新功能
热门文章
- 单片机读取obd_OBD_CAN读取代码(stm32f103)
- SOM网络1:原理讲解
- 7.4 初等矩阵和可逆性
- Oxygen XML Editor Mac版(基于Java的XML编辑器)
- Mybatis-plus读取(GeoJson)和保存Postgis geography数据
- module xxx missing dependencies
- C语言之顺序程序设计学习笔记
- 关于Neuro-Fuzzy Designer的使用
- GD32F30x系列系统及存储器架构
- 机器人潘森护盾_[翻译团]10.21版本五大强势辅助:潘森、蕾欧娜、机器人、巴德、璐璐...