[BZOJ1242]抢修道路
来源:互联网 发布:python lxml etree 编辑:程序博客网 时间:2024/05/22 04:48
题目描述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。输入输入文件的第一行为一个整数N,以下n行每行一个整数Ai,表示路面的高度。输出输出文件仅有一个正整数,表示如果把路修成高度不上升或高度不下降的最小花费样例输入71324539样例输出3提示将第一个高度为3的路段的高度减少为2,将第二个高度为3的路段的高度增加到5,总花费为|2-3|+|5-3| = 3,并且各路段的高度为一个不下降序列1,2,2,4,5,5,9。题解:修改高度时, 一定是修改成原数组中的数字最优。
因为无论数字加减多少, 总是当它和旁边的数字一样大时有最优解,
这样在满足单调性(两数相等也算)的同时使改变的数值最小。
前面修改过的数字在后面有可能会继续修改, 所以它可能取到原数组中的任何一个数字。
定义dp[i][j]: 第i个数字, 换为有序序列的第j个数字, 的最小花费
不降序列: dp[i][j]=min{ dp[i-1][k] }+Abs( h[i]-uph[j] ) ( 1<=i<=n, i<=j<=n, i<=k<=j )
不升序列: dp[i][j]=min{ dp[i-1][k] }+Abs( h[i]-dnh[j] ) ( 1<=i<=n, i<=j<=n, i<=k<=j )
这样复杂度接近n^3, 显然要超时,
可以发现dp[i][j]的值只跟min{ dp[i-1][k] }有关, 可以用dp[i][j]记录dp[i][1]~dp[i][j]的最小值, 直接拿dp[i−1][j]来用。
dp[i][j]=min( dp[i][j], dp[i-1][j]+Abs( h[i]-dnh[j] ) )
dp[i][j]=min( dp[i][j], dp[i][j-1] );
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int N=2010;int n, h[N], uph[N], downh[N];int dp[N][N]; int Abs( int x ) { return x<0 ? (-x) : x ; }int main() { scanf( "%d", &n ); for( int i=1; i<=n; i++ ) scanf( "%d", &h[i] ), uph[i]=h[i]; sort( uph+1, uph+n+1 ); for( int i=1; i<=n; i++ ) downh[n-i+1]=uph[i]; for( int i=1; i<=n; i++ ) for( int j=1; j<=n; j++ ) { dp[i][j]=INF; dp[i][j]=min( dp[i][j], dp[i-1][j]+Abs( h[i]-uph[j] ) ); if( j!=1 ) dp[i][j]=min( dp[i][j], dp[i][j-1] ); } int ans=dp[n][n]; memset( dp, 0, sizeof dp ); for( int i=1; i<=n; i++ ) for( int j=1; j<=n; j++ ) { dp[i][j]=INF; dp[i][j]=min( dp[i][j], dp[i-1][j]+Abs( h[i]-downh[j] ) ); if( j!=1 ) dp[i][j]=min( dp[i][j], dp[i][j-1] ); } printf( "%d\n", min( ans, dp[n][n] ) ); return 0;}
阅读全文
0 0
- [BZOJ1242]抢修道路
- 道路
- 道路
- 道路
- 兄弟!快抢修电脑!
- 1029: [JSOI2007]建筑抢修
- bzoj1029: [JSOI2007]建筑抢修
- BZOJ1029: [JSOI2007]建筑抢修
- BZOJ1029建筑抢修
- [BZOJ1029][JSOI2007]建筑抢修
- 堆--建筑抢修nkoj2375
- NKOI 2375 建筑抢修
- [JSOI2007]建筑抢修
- [JSOI2007]建筑抢修
- bzoj[JSOI2007]建筑抢修
- [JSOI2007]建筑抢修
- BZOJ1029 [JSOI2007]建筑抢修
- 【bzoj1029】[JSOI2007]建筑抢修
- pair(2)
- js页面跳转
- 开通博客-贴吧6000回复的继续
- 【HDU 1074 Doing Homework】+ 状压dp
- 网站设置缓存的问题
- [BZOJ1242]抢修道路
- 机器人视觉—以箱子为目标的跟踪检测
- zoj 1940 模拟三维bfs
- 【内功篇】指针&数组&字符串(五)
- 在servlet 中使用 request.getSession().getServletContext().getRealPath("upload/" ); 获取不到 tomcat 服务器目录
- STM32F767+TB6600+57步进电机
- Java中自写LinkedList,掌握底层结构
- Tensorflow中关于Tensor和Variable的理解
- Python用filter()滤掉非回数