【DP】 路面修整 usaco 2008 feb

阅读: 评论:0

【DP】 路面修整 usaco 2008 feb

【DP】 路面修整 usaco 2008 feb

题目描述:

```

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]);elsef[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("%dn", ans);
}

 

 

 

 

 

本文发布于:2024-01-30 12:53:37,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170659042020138.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:路面   DP   usaco   feb
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23