[bzoj1592] Making the Grade

[bzoj1592] Making the Grade

题目

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。

INPUT

第1行: 输入1个整数:N

第2..N+1行: 第i+1行为1个整数:A_i

OUTPUT

第1行: 输出1个正整数,表示FJ把路修成高度不上升或高度不下降的最小花费

SAMPLE

INPUT

7

1

3

2

4

5

3

9

OUTPUT

3

解题报告

很明显的DP,然而考试时没想出方程,随便打了个贪心,竟然还能骗40分= =

正解:

离散高度后DP

f[i][j]表示到这个节点,在高度为j(离散后)或大于j时(求不上升序列时大于,不下降序列是小于),所需要的最小支出。

在求不下降序列时:

f[i][j]=min{f[i-1][j]+ads(height[i]-j)}

f[i][j]=min(f[i][j],f[i][j-1])

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 inline int read(){
 7     int sum(0);
 8     char ch(getchar());
 9     for(;ch<‘0‘||ch>‘9‘;ch=getchar());
10     for(;ch>=‘0‘&&ch<=‘9‘;sum=sum*10+(ch^48),ch=getchar());
11     return sum;
12 }
13 int a[2001],Hash[2001];
14 int size;
15 int n;
16 inline void Hash_init(){
17     sort(Hash+1,Hash+n+1);
18     size=unique(Hash+1,Hash+n+1)-Hash-1;
19 }
20 inline int jdz(int x){
21     return x>=0?x:-x;
22 }
23 inline int my_min(int a,int b){
24     return a<b?a:b;
25 }
26 int f[2001][2001];
27 int ans(0x7fffffff);
28 int main(){
29     n=read();
30     for(int i=1;i<=n;i++)
31         Hash[i]=a[i]=read();
32     Hash_init();
33     memset(f,0x3f,sizeof(f));
34     for(int i=1;i<=size;i++)
35         f[0][i]=0;
36     for(int i=1;i<=n;i++)
37         for(int j=1;j<=size;j++){
38             f[i][j]=my_min(f[i][j],f[i-1][j]+jdz(Hash[j]-a[i]));
39             f[i][j]=my_min(f[i][j],f[i][j-1]);
40         }
41     ans=my_min(ans,f[n][size]);
42     memset(f,0x3f,sizeof(f));
43     for(int i=1;i<=size;i++)
44         f[0][i]=0;
45     for(int i=1;i<=n;i++)
46         for(int j=size;j>=1;j--){
47             f[i][j]=my_min(f[i][j],f[i-1][j]+jdz(Hash[j]-a[i]));
48             f[i][j]=my_min(f[i][j],f[i][j-1]);
49         }//cout<<‘*‘;
50     ans=my_min(ans,f[n][1]);
51     printf("%d",ans);
52 }

时间: 2024-08-02 15:10:31

[bzoj1592] Making the Grade的相关文章

暑假集训D9总结

考试 几乎绝望的考试= =,感觉自己啥都打不出来= =,就一道DP打了个贪心,剩下两道骗分,然而竟然排到前一半= =,不可思议= = 真是令人窒息的操作啊= = T1  [bzoj1592] Making the Grade T2  [Usaco2007 Open]Fliptile 翻格子游戏 T3  [POI2008]枪战Maf 博客 github成功炸掉了,呜呜呜 然后我就搞了一晚上+半个早晨的补档= = 顺便导致了这篇D9的总结只能在D10扔出来 令人绝望啊 生活 我已经快GG了= = 退

[BZOJ1592][Usaco2008 Feb]Making the Grade 路面修整

1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 735  Solved: 509 [Submit][Status][Discuss] Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个整数A_1, ...

【bzoj1592/Usaco2008 Feb】Making the Grade 路面修整——dp

Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个整数A_1, ... , A_N (1 <= N <= 2,000)依次描述了每一段路的高度(0 <= A_i <= 1,000,000,000).FJ希望找到一个恰好含N个元素的不上升或不下降序列B_1, ... , B_N,作为修过的路中每个路段的高度.由于将每一段路垫高

Making the Grade (bzoj1592)题解

又一次爆零,好欣慰. 这次这道题讲真简单,然而freopen又一次打错了,又一次-- 由于这几天一直在搞网络流,上来就按照网络流的思路搞,显然,搞不出来,于是由于"最小"这个敏感词语,想到了DP.开搞. 首先是一个证明,修改完后每条道路的高度一定是原来就有的数据,至少这是最优解之一,由于这道题并未要求打印方案,因此只要确定这一点这道题就做完25%了. 那么我们可以先把问题拆开来看,求不上升和求不下降,不上升可以把整个数列倒过来,因此这道题就是输出不下降序列的最优解了.假设我们只有两条道

Making the Grade (bzoj1592)

题目描述 FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个整数A_1, ... , A_N (1 <= N <= 2,000)依次描述了每一段路的高度(0 <= A_i <= 1,000,000,000).FJ希望找到一个恰好含N个元素的不上升或不下降序列B_1, ... , B_N,作为修过的路中每个路段的高度.由于将每一段路垫高或挖低一个单位

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

最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 i 个路面单调不递减, 第 x 个路面修整为原来的第 t 高的高度. 时间复杂度O( n³ ). 令g(x, t) = min{ dp(x, k) } (1 <= k <= t), 则转移O(1), g() 只需在dp过程中O(1)递推即可, 总时间复杂度为O( n² ) 然后单调不递增也跑一遍

POJ 3666 Making the Grade [DP]

题意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,这里的代价看题目公式. 思路: 很容易想到是DP. 1. 对前i个序列,构成的最优解其实就是与两个参数有关.一个是这个序列处理后的最大值mx,和这个序列处理的代价值cost. 显然最大值mx最小最好(这样第i+1个值可以不花代价直接接在其后面的可能性更大),cost最小也最好(题意要求),但是两者往往是鱼和熊掌. 用dp[i][j]表示:前i个数构成的序列,这个序列最大值为j,dp[i][j]的值代表相应的cost. 所以状态转移方

Furniture grade plywood from Long Da Wood xzml

Glad to hear that you're on the market for plywood products. We specialize in this field for 16 years, with good quality and competitive price two hour reach Qingdao port, this is how we keep good quality and competitive prices for global valued cust

Making the Grade POJ - 3666

A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would like. His cows do not mind climbing up or down a single slope, but they are not fond of an alternating succession of hills and valleys. FJ would like t