题意:给出一个 n (1 <= n <= 5000)个数的序列 。每个操作可以把 n 个数中的某一个加1 或 减 1。问使这个序列变成非递减的操作数最少是多少

解法:定义dp[i][j]为将前i个数变为以j为结尾的非递减序列的最少操作次数。

则有: dp[i][j] = min(dp[i][j], min(dp[i][k]) + Cost(原来第i个位置上的数转换到j))  (1 <= k <= j)

即前i个数以j结尾的状态可以由前i-1个数以小于等于j的k结尾的状态转移过来,取一个最小的转移

由于输入过大,需要离散化,将数组的复制b[]排序后用到unique函数,unique函数将数组中相邻元素重复的去掉(实际不去掉,只是放到最后面),然后返回最后一个不与其他元相同的数的地址,所以通过unique(b,b+n)-b可得到该数列实际不同的数有多少个,然后我们上述方程中的j就在这些里面取,Cost其实计算方法为abs(b[j]-a[i])

同时数组不可能存下5000*5000,由于每一个状态都从前一个推来,于是可以用滚动数组。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define lll __int64
using namespace std;
#define N 5007 const lll INF = (1LL<<);
lll dp[][N];
lll a[N],b[N]; int main()
{
int n,i,j;
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%I64d",&a[i]);
b[i] = a[i];
}
sort(b,b+n);
int tot = unique(b,b+n) - b; //离散化成 0~tot
for(i=;i<tot;i++)
{
dp[][i] = abs(b[i]-a[]);
dp[][i] = INF;
}
int now = ;
for(i=;i<n;i++)
{
lll mini = INF;
for(j=;j<tot;j++)
{
mini = min(dp[now^][j],mini);
dp[now][j] = min(dp[now][j],mini+abs(b[j]-a[i]));
}
now = -now;
for(j=;j<tot;j++)
dp[now][j] = INF;
}
lll mini = INF;
for(i=;i<tot;i++)
mini = min(mini,dp[-now][i]);
printf("%I64d\n",mini);
return ;
}

Codeforces 13C Sequence --DP+离散化的更多相关文章

  1. Codeforces 13C Sequence dp

    题目链接:http://codeforces.com/problemset/problem/13/C 题意: 给定n长的序列 每次操作能够给每一个数++或-- 问最少须要几步操作使得序列变为非递减序列 ...

  2. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  3. Codeforces 13C Sequence

    http://codeforces.com/contest/13/problem/C 题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少 ...

  4. CodeForces 13C【DP】

    题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列: n是5e3,复杂度n^2内.值是1e9: 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[ ...

  5. CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)

    传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...

  6. CF13C Sequence(DP+离散化)

    题目描述 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.求最少的修改次数. 输入输出样例 输入 #1 - 输出 #1 4 输入 #2 输出 #2 1 解题思路 这题是一道非常好题 ...

  7. POJ - 3666 Making the Grade(dp+离散化)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  8. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  9. Codeforces Round #277 (Div. 2) E. LIS of Sequence DP

    E. LIS of Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/pr ...

随机推荐

  1. PHP imagecopyresampled 参数图示

  2. mysql 5.6到percona 5.6小版本升级

    假设原来是mysql 5.6.19社区版,现在要升级到percona server 5.6.30. 对于大的数据库来说,采用mysqldump方式进行迁移太花费时间了,可采用新安装加载原来数据库的方式 ...

  3. Webform(Repeater控件)

    一.Repeater控件 有五大模板 ItemTemplate :有多少条数据,执行多少遍        AlternatingItemTemplate : 对交替数据项进行格式设置       Se ...

  4. android sdk无法更新或者更新缓慢的解决方案

    win7安装android sdk老出 Fetching https://dl-ssl.google.com/android/repository/addon .这是android sdk不能连接到谷 ...

  5. Atitit.json xml 序列化循环引用解决方案json

    Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...

  6. Sharepoint 2013 列表使用JS Link

    使用JS Link可以向Sharepoint List注册脚本,重写Field模板,使得对于符合条件的字段改变格式和样式.但是有一个问题是,页面postback的话,JS不会被触发,不知道怎么解,有知 ...

  7. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q91-Q93)

    Question 91You have a custom user profile property named MyProperty.You need to create a Web Part th ...

  8. 用Path来绘制一些图形

    Path是android中用来封装几何学路径的一个类,因为Path在图形绘制上占的比重还是相当大的.你可以用它来绘制各种样式的几何图形,做图表什么的都可以. 一.画线段 1.1 lineT(float ...

  9. 安卓开发-See the log file\.metadata\.log.

    今天在给安卓项目res-valus-string.xml 中字符串修改的时候,突然eclipse卡住了 然后任务管理器关掉之后,重新打开 显示一个错误 百度了一下 eclipse启动报错,让查看.me ...

  10. [leetcode] Reverse Bits

    Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...