河南2014 省赛 山间修路 dp

10403: D.山区修路

Time Limit: 2 Sec  Memory Limit: 128 MB

Submit: 15  Solved: 7

[Submit][Status][Web
Board
]

Description

某山区的孩子们上学必须经过一条凹凸不平的土路,每当下雨天,孩子们非常艰难。现在村里走出来的Dr. Kong决定募捐资金重新修建着条路。由于资金有限,为了降低成本,对修好后的路面高度只能做到单调上升或单调下降。

为了便于修路,我们将整个土路分成了N段,每段路面的高度分别A1,A2,….,An。由于将每一段路垫高或挖低一个单位的花费成本相同,修路的总费用与路面的高低成正比。

现在Dr. Kong希望找到一个恰好含N个元素的不上升或不下降序列B1,B2,….,Bn,作为修过的路路段的高度。要求:

| A1-B1|
+ | A2–B2| + ... + |
An-Bn|------>最小

Input

第一行: K                           表示有多少组测试数据。

接下来对每组测试数据:

第1行:      
N               
表示整个土路分成了N段

第2~N+1行: A1 
A2……AN  
  表示每段路面的高度

2≤k≤10   
  0≤Ai≤107
    0≤N≤500   
(i=1,…, N)

所有数据都是整数。数据之间有一个空格。

数据保证| A1-B1|+|
A2-B2|+ ... +| An-Bn|的最小值不会超过109

Output

对于每组测试数据,输出占一行:| A1-B1|+| A2-B2|+ ... +| An-Bn|的最小值。

Sample Input

271 3 2 4 5 3 958 6 5 6 2

Sample Output

31
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
int dp[505][505];
int a[505];
int b[505];

int main(){
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		for(int i = 0;i < n;i++){
			scanf("%d",&a[i]);
		}

		memcpy(b,a,n * sizeof(a[0]));
		sort(b,b+n);

		for(int i = 0;i < n;i++){
			for(int j = 0;j < n;j++){

				int t = INT_MAX;
				for(int k = 0;k <= j;k++){
					t = min(t,dp[i][k]);
				}
				dp[i+1][j] = t + abs(b[j] - a[i]);
			}
		}

		int ma = INT_MAX;
		for(int i = 0;i < n;i++){
			if(dp[n][i] < ma){
				ma = dp[n][i];
			}
		}

		reverse(a,a+n);
		for(int i = 0;i < n;i++){
			for(int j = 0;j < n;j++){

				int t = INT_MAX;
				for(int k = 0;k <= j;k++){
					t = min(t,dp[i][k]);
				}
				dp[i+1][j] = t + abs(b[j] - a[i]);
			}
		}

		int mi = INT_MAX;
		for(int i = 0;i < n;i++){
			if(dp[n][i] < ma){
				mi = dp[n][i];
			}
		}

		cout << min(mi,ma) << endl;
	}
}

时间: 2024-10-21 01:34:22

河南2014 省赛 山间修路 dp的相关文章

河南2014 省赛 世界之威 拓扑排序

10404: E.世界之威 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 2  Solved: 1 [Submit][Status][Web Board] Description 某帝国拥有着N 种被称作"世界之威"的新型武器.现在为了国家的经济发展,它需要很多资金,为此,此帝国总统OBM准备把一些武器卖给其它国家. 此帝国总统OBM知道,这N种武器之间可能会相互受限制的.例如,第3种武器会打败第1种武器,第4种武器会打败第3种武器等等

2014广东省赛总结

第一次写省赛总结,总的来说这次省赛表现的不是特别理想吧,一方面是题目的原因,另一方面也有很大部分是个人的原因. 要说省赛的比赛过程,其实前半程还是比较正常的,一上来SF就发现A题的水性很快的敲了出来.然后我一看K,感觉这个字符串不是特别好搞继续往前看,看到一些计数的也不是特别好搞,就看到H,H就是求出凸包上的每个点离它的最远点,我一看这不是对踵点么(凭着我所知不多的计算几何知识),于是迅速YY出了旋转卡壳的时候更新一下的算法,那个时候心里自知也是不大可以的了,但是觉得在没有别的题可以做的时候值得

【转】2014区域赛小结(牡丹江&amp;&amp;鞍山)by kuangbin

Posted on 2014年10月20日 by kuangbin 最后的两场区域赛结束了! ICPC生涯的最后两场区域赛,选择了前两个赛区——牡丹江和鞍山,主要是时间比较靠前,而且我向来对东北赛区有特殊的偏好,我打过的区域赛几乎都是在东北(除了第一年打酱油的时候). 而且特别想回到牡丹江去,在那个曾经打过比赛的地方再打一次比赛,拿回自己想要的. 而且今年岐哥也要打前两场,所以就选择了前两个赛区和岐哥一起打退役赛! 两场比赛采用队名——Final_Battle (最后一战),决心背水一战,认真打

2014辽宁省赛 Traveling

问题 K: Traveling 时间限制: 1 Sec  内存限制: 128 MB 提交: 13  解决: 4 [提交][状态][论坛] 题目描述 SH likes traveling around the world. When he arrives at a city, he will ask the staff about the number of cities that connected with this city directly. After traveling around 

2014省赛总结

终于结束了2天的比赛,第一次参加省赛,参加省赛前,心中有期待和忐忑,但省赛结束后,却是有一点小失望,但更多的是对自己表现的失望,对自己平时学习的不够努力而失望,总是偷懒. 此次比赛,卡题是我们队失误的最大原因,从开出前两题后,就卡在A题难以前进半步,在中途也想放弃A题,但是看到榜上那么多人都做出来了,心里着急,想要放弃,看其他题心静不下来,还是在想A,A题考察的是数学知识-积分,亏我今年3月分还补考高数,自己平时集训时看到数学题,一般过掉,不喜欢做数学方面的题目,报应啊.导致,我们一直卡A题,给

csu 2014 summer day 4 树形dp升阶

POJ 1155 题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 要知道用户都在叶子节点,费用消耗在使用选择的路径上,每条路径的使用费用给出,每个用户支付的费用给出. 输入:N为总节点数,M为用户数,1为电视台, 2 to N-M 是中转站,N-M+1到N是潜在用户 对于1到N-M的中继点,给出连接的点的个数K,K对(A,C)表示连接到A点,这条路径的费用是C 最后是M个整数,表示用户支付的费用 分析: int

HDU - 4734 F(x) (2013成都网络赛,数位DP)

题意:求0-B的满足<=F[A]的所有可能 思路:数位DP,记忆化搜索 #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; int A, B; int dp[20][200000]; int bit[20]; int dfs(int cur, int num, int flag) { if (cur == -

2014 summer day 6 概率dp

全期望公式: 全概率公式: POJ 2096 [题意]: 一个软件有s个子系统,会产生n种bug.某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中.求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望.[分析]:需要注意的是:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s,属于某种类型的概率是1/n. 那么dp[i][j]表示还要找到i个系统,还要找到j种病毒的概率. 具体dp方程看代码.但怎么来说这个dp方程的正确性都怪怪的.

2014省赛大总结(一) DFS 与 BFS

list里的元素以逗号隔开,以[]包围,其中元素的类型任意 官方一点的说:list列表是一个任意类型的对象的位置相关的有序集合.它没有固定的大小(1),通过对偏移量 (2)进行赋值以及其他各种列表的方法进行调用,能够修改列表的大小. (1)尽管列表没有固定的大小,Python仍不允许引用不存在的元素,超出列表末尾之外的索引会导致错误,赋值也是. (2)我们可以通过偏移量对列表进行索引,切片等操作,而且索引值可为负值. list的主要属性 <1>任意对象的有序集合(从左到右的顺序) <2&