P2893 [USACO08FEB]修路
直入主题。 农夫约翰想改造一条路,原来的路的每一段海拔是Ai,修理后是Bi花费|A_i–B_i|。我们要求修好的路是单调不升或者单调不降的。求最小花费。
数据范围:n<=2000,0≤ Ai ≤ 1,000,000,000
(说真的,时隔几个月,发现这题其实挺简单的)
最一开始,就打了一个贪心。
#include<bits/stdc++.h>//本人打题目时很喜欢万能头
using namespace std;
const int maxn=;
long long n,ans1,ans2;
long long a[maxn]; int main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=;i<n;i++)
{
if(a[i]>a[i+])
ans1+=abs(a[i]-a[i+]);
//printf("%d\n",ans1);
}
for(int i=n;i>;i--)
{
if(a[i]>a[i-])
ans2+=abs(a[i-]-a[i]);
//printf("%d\n",ans2);
}
printf("%d",min(ans1,ans2));
return ;
}

此贪心思路 很容易发现,如果想要最小值的话,凹下去的土块一定会被填起来,而且填的高度一定会使这个土块和两侧最低的那个相平(比如样例第三个土块,填起来一定会和 二 一样高)于是考虑跑两遍,一个单增,一个单减。
结果:40分
。。。
随手一组hack数据:
9 5 5 5 1 1 1 5 5 5;
我没有及时更新高度,以至于会有后效性。 于是我每次减完会把它更新一次高度。 但是发现,还是会有后效性,hack数据还是毒瘤。
我终于想到了dp(我恨dp)
接下来考虑转移方程式 考虑第i个土块,对其有影响的数据只有前i个土块的高度,还有本土块的高度,所以: 我们用dp[i][j]将前i段变作不下降序列,且第j段道路的高度为j时的最小花费

但是,j的枚举会把时间炸上天!!!!
通过前面的结论,我们发现,最小的填补一定会在目标高度中出现,所以我们开另外一个数组,把高度存到里面,排序,从里面找一个合适的Ai,就省去了遍历1—100000000的时间
继续方程式。写出来就是这样,前i个柱子最小(此为单调不递减)
此题,洛谷数据过于划水以至于只考虑单增就可以过了。
于是放代码(只放单增的了)
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7fffffff;
const int maxn=;
int n;
int a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
int ans=inf;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b++n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(j==)//因为循环边界,所以当j==1我们要特判一发,把1拍到最低
dp[i][j]=dp[i-][j]+abs(a[i]-b[j]);
else
dp[i][j]=min(dp[i][j-],dp[i-][j]+abs(a[i] - b[j]));//拍土了
if(i==n)
ans=min(dp[i][j],ans);
}
}
printf("%d\n",ans);
return ;
}
(膜拜一下隔壁dp神仙)
P2893 [USACO08FEB]修路的更多相关文章
- 洛谷 P2893 [USACO08FEB]修路Making the Grade 解题报告
P2893 [USACO08FEB]修路Making the Grade 题目描述 A straight dirt road connects two fields on FJ's farm, but ...
- 【DP】+【贪心】【前缀和】洛谷P2893 [USACO08FEB]修路Making the Grade 题解
正常的没想到的DP和玄学贪心. 题目描述 A straight dirt road connects two fields on FJ's farm, but it changes eleva ...
- [USACO08FEB]修路Making the Grade
[USACO08FEB]修路Making the Grade比较难的dp,比赛时打的找LIS,然后其他的尽可能靠近,40分.先举个例子61 2 3 1 4 561 2 3 3 4 5第4个1要么改成3 ...
- luogu2893 [USACO08FEB]修路Making the Grade
ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...
- [USACO08FEB]修路Making the Grade 动态规划
对的\(n^3\)的程序调了一个月了,惊了... HSZ学oi\(\Longleftrightarrow\)闭眼学oi 要不是翻旧账还看不见.. 这是有\(n^2\)做法的. 参见LYD的书P244 ...
- USACO Making the Grade
洛谷 P2893 [USACO08FEB]修路Making the Grade https://www.luogu.org/problemnew/show/P2893 JDOJ 2566: USACO ...
- 【贪心】bzoj1592: [Usaco2008 Feb]Making the Grade 路面修整
贪心的经典套路:替换思想:有点抽象 Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也 就是说,高度上升与高度下降的路段不能 ...
- 重修 Slope Trick(看这篇绝对够!)
Slope Trick 算法存在十余载了,但是我没有找到多少拍手叫好的讲解 blog,所以凭借本人粗拙的理解来写这篇文章. 本文除标明外所有图片均为本人手绘(若丑见谅),画图真的不容易啊 qwq(无耻 ...
- LA 5713 秦始皇修路 MST
题目链接:http://vjudge.net/contest/144221#problem/A 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不 ...
随机推荐
- A-05 前向选择法和前向梯度法
目录 前向选择法和前向梯度法 一.前向选择法 1.1 余弦相似度求投影 1.2 举例 1.3 前向选择法优缺点 1.3.1 优点 1.3.2 缺点 二.前向梯度法 2.1 举例 2.2 前向梯度法优缺 ...
- python编程基础之三十二
成员方法:成员方法就是一个函数,只是作用域在类内,并且第一个参数必须是self,self代表当前对象, class Dog(object): def bark(self): #成员方法,第一个参数必须 ...
- NAT模式实现虚拟机共享主机网络
上一节我们在虚拟机上搭建了linux系统,并利用桥接模式访问互联网,这一节,我们来配置一下通过NAT模式访问互联网.说到这里有些小伙伴可能要问了,NAT模式和桥接模式有什么区别呢? 桥接模式: 虚拟机 ...
- CentOS 7 的 systemctl 命令
Centos 7.* 使用 Systemd 进行系统初始化,因此,Centos 7.* 中我们可以使用 systemctl 管理系统中的服务. systemctl 管理的服务均包含了一个以 .serv ...
- Spring5源码解析6-ConfigurationClassParser 解析配置类
ConfigurationClassParser 在ConfigurationClassPostProcessor#processConfigBeanDefinitions方法中创建了Configur ...
- django rest framework1
内容回顾: 1.开发模式 - 普通开发方式(前后端放在一起写) - 前后端分离 2.后端开发 为前端提供URL(API/接口的开发) 注:永远返回HttpResponse 3.Django FBV.C ...
- Three Key Points of Success 成功三要素
Everyone wants to be successful. Today I would like to share three simple key points of success. Num ...
- Django-admin站点管理的详细使用
使用Django的管理模块,需要按照如下步骤操作: 管理界面本地化 创建管理员 注册模型类 自定义管理页面 1 管理界面本地化 在settings.py中设置语言和时区 LANGUAGE_CODE = ...
- 利用Echarts实现全国各个省份数据占比,图形为中国地图
最近项目需求,需要一个对于全国各个省份的数据分析,图形最好是地图的样子,这样子更为直观. 最先想到的图表插件是Echarts,他的文档相对于阿里的G2,G6更加清晰一些.在Echarts 里找到的个 ...
- Debian更新源加安装Metespolit&&Cobalt Strike
首先更新下源 修改/etc/apt/sources.list文件 再apt-get update deb http://mirrors..com/debian/ stretch main non-fr ...