题目描述:

```

FJ打算好好修一下农场中某条凹凸不平的土路。按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中。

整条路被分成了N段,N个整数A_1, ... , A_N (1 <= N <= 2,000)依次描述了每一段路的高度(0 <= A_i <= 1,000,000,000)。FJ希望找到一个恰好含N个元素的不上升或不下降序列B_1, ... , B_N,作为修过的路中每个路段的高度。由于将每一段路垫高或挖低一个单位的花费相同,修路的总支出可以表示为:

|A_1 - B_1| + |A_2 - B_2| + ... + |A_N - B_N|

请你计算一下,FJ在这项工程上的最小支出是多少。FJ向你保证,这个支出不会超过2^31-1。

```

题目大意:给出一个数列,让你把它修改为一个不上升或不下降序列,使得修改的费用尽量少。修改的费用定义为:修改后与修改前的值之差的绝对值。

因为不上升就是倒序+不下降,所以只用考虑不下降就行了。首先将数组从小到大排序为s,用f[i][j]表示前i个数都满足条件的情况下第i个数修改为s[j]的最小费用。则状态转移方程为 f[i][j] = min{ f[i-1][k] + abs(s[k]-num[i]) | j <= n }。然而这样时间复杂度是O(n^3),因此需要改变一下策略。

用f[i][j]表示前i个数都满足条件的情况下第i个数小于等于s[j]的最小费用。则状态转移方程为 f[i][j] = min{ f[i][j-1] , f[i-1][j] + abs(s[j]-num[i]) }。时间复杂度就被降到了O(n^2)。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int inf = (1 << 30); int n, a[2005], b[2005], s[2005], f[2005][2005], ans; void dp(int *A) {
memset(f, 0, sizeof f);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(j == 1)
f[i][j] = f[i-1][j] + abs(A[i] - s[j]);
else
f[i][j] = min(f[i][j-1], f[i-1][j] + abs(A[i] - s[j]));
if(i == n) ans = min(ans, f[i][j]);
}
}
} int main () { scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]), s[i] = a[i], b[n - i + 1] = a[i];
sort(s + 1, s + n + 1);
ans = inf; dp(a); dp(b);
printf("%d\n", ans);
}

【DP】 路面修整 usaco 2008 feb_gold的更多相关文章

  1. BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )

    最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 ...

  2. [BZOJ 1592] Making The Grade路面修整

    1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 704  Solv ...

  3. [bzoj1592][Usaco09Feb]Making the Grade 路面修整_动态规划

    Making the Grade 路面修整 bzoj-1592 题目大意:给你n段路,每段路有一个高度h[i],将h[i]修改成h[i]$\pm\delta$的代价为$\delta$,求将这n段路修成 ...

  4. 1592: [Usaco2008 Feb]Making the Grade 路面修整

    1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 428  Solv ...

  5. 【DP】BZOJ1592-[Usaco2008 Feb]Making the Grade 路面修整

    我活着从期中考试回来了!!!!!!!!!备考NOIP!!!!!!!!! [题目大意] 给出n个整数a1~an,修改一个数的代价为修改前后差的绝对值,问修改成不下降序列或者不上升序列的最小总代价. [思 ...

  6. [usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp

    原网站大概已经上不了了-- 题目大意: 求出平面上n个点组成的一个包含顶点数最多的凸多边形.n<=250. 考虑我们每次枚举凸包的左下角为谁(参考Graham求凸包时的左下角),然后像Graha ...

  7. [BZOJ1592] [Usaco2008 Feb]Making the Grade 路面修整(DP)

    传送门 有个结论,每一个位置修改高度后的数,一定是原来在这个数列中出现过的数 因为最终结果要么不递增要么不递减, 不递增的话, 如果x1 >= x2那么不用动,如果x1 < x2,把x1变 ...

  8. 【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态

    我们感性可证离散(不离散没法做),于是我们就有了状态转移的思路(我们只考虑单不减另一个同理),f[i][j]到了第i块高度为j的最小话费,于是我们就可以发现f[i][j]=Min(f[i-1][k]) ...

  9. bzoj 1592: [Usaco2008 Feb]Making the Grade 路面修整【dp】

    因为是单调不降或单调不升,所以所有的bi如果都是ai中出现过的一定不会变差 以递增为例,设f[i][j]为第j段选第i大的高度,预处理出s[i][j]表示选第i大的时,前j个 a与第i大的值的差的绝对 ...

随机推荐

  1. 06-switch语句

    switch语句 switch是一个条件语句,它是可以代替多个if else的常用方式 例子 package main import "fmt" func main() { a:= ...

  2. kubernetes1.16 配置 metrics-server

    kubernetes1.16 版本对应最新的metrics-server为v0.3.5. 下载metrics-server配置文件 git clone https://github.com/kuber ...

  3. 关于django操作orm的一些事--反向生成orm、连接多个数据库

    1. django反向生成orm的类代码 使用命令python manage.py inspectdb > app01/models.py,注意,我这里的app01是app的名字. 2.djan ...

  4. IdentityServer4(客户端授权模式)

    1.新建三个项目 IdentityServer:端口5000 IdentityAPI:端口5001 IdentityClient: 2.在IdentityServer项目中添加IdentityServ ...

  5. [高清] JavaEE开发的颠覆者 Spring Boot实战 完整版

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  6. 将ftp目录映射为本地盘符

    1.ftpuser 下载安装FTPUSE下载地址:http://www.ferrobackup.com/ftpuse/ 创建  FTPUSE F: www.xx.com pwd  /USER:admi ...

  7. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

  8. python3-使用requests模拟登录网易云音乐

    # -*- coding: utf-8 -*- from Crypto.Cipher import AES import base64 import random import codecs impo ...

  9. GitHub上传文件问题总结

    问题一:git warning: LF will be replaced by CRLF in 解决办法 在Git Bash中输入git add .时出现上述语句. 解决办法: 输入以下语句: $ g ...

  10. Node.js学习(第二章:node核心模块--fs)

    前言 Node.js中赋予了JavaScript很多在浏览器中没有的能力,譬如:文件读写,创建http服务器等等,今天我们就来看看在node中怎样用JavaScript进行文件的读写操作. 读文件 我 ...