【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态
我们感性可证离散(不离散没法做),于是我们就有了状态转移的思路(我们只考虑单不减另一个同理),f[i][j]到了第i块高度为j的最小话费,于是我们就可以发现f[i][j]=Min(f[i-1][k])+|a[i]-j|(k<=j),于是我们的思路就去了各种数据结构…….然后我们发现对于这些转移就是在记录小于等于,那么我们直接带状态里体现这一点就可以了,而不是在转移的时候,我们f[i][j]表示到了第i个点小于等于j的高度的最小花费,这样我们就n^2了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2010
using namespace std;
inline int read()
{
register int sum=;register char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')sum=(sum<<)+(sum<<)+ch-'',ch=getchar();
return sum;
}
int a[N],f[N][N],ans,n,pos[N],len,Hash[N];
int comp(const int x,const int y){
return a[x]<a[y];
}
inline int Min(int x,int y){
return x<y?x:y;
}
inline int Abs(int x){
return x<?-x:x;
}
inline int get_Min(){
memset(f,0x7f,sizeof(f));register int ans=0x7fffffff;
for(register int i=;i<=len;i++)f[][i]=Min(f[][i-],Abs(Hash[i]-Hash[a[]]));
for(register int i=;i<=n;i++)
for(register int j=;j<=len;j++)
f[i][j]=Min(f[i][j-],f[i-][j]+Abs(Hash[j]-Hash[a[i]]));
for(register int i=;i<=len;i++)ans=Min(ans,f[n][i]);
return ans;
}
inline int get_Max(){
memset(f,0x7f,sizeof(f));register int ans=0x7fffffff;
for(register int i=;i<=len;i++)f[][i]=Min(f[][i+],Abs(Hash[i]-Hash[a[]]));
for(register int i=;i<=n;i++)
for(register int j=len;j>;j--)
f[i][j]=Min(f[i][j+],f[i-][j]+Abs(Hash[j]-Hash[a[i]]));
for(register int i=;i<=len;i++)ans=Min(ans,f[n][i]);
return ans;
}
int main(){
n=read();for(register int i=;i<=n;i++)a[i]=read(),pos[i]=i;
sort(pos+,pos+n+,comp);
for(register int i=;i<=n;i++)
if(i==||a[pos[i]]!=a[pos[i-]])Hash[++len]=a[pos[i]],a[pos[i]]=len;
else a[pos[i]]=len;
printf("%d",Min(get_Min(),get_Max()));
}
【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态的更多相关文章
- BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )
最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 ...
- BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整
Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了 ...
- bzoj 1592: [Usaco2008 Feb]Making the Grade 路面修整【dp】
因为是单调不降或单调不升,所以所有的bi如果都是ai中出现过的一定不会变差 以递增为例,设f[i][j]为第j段选第i大的高度,预处理出s[i][j]表示选第i大的时,前j个 a与第i大的值的差的绝对 ...
- 1592: [Usaco2008 Feb]Making the Grade 路面修整
1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 428 Solv ...
- 【BZOJ】1592: [Usaco2008 Feb]Making the Grade 路面修整
[算法]动态规划DP [题解] 题目要求不严格递增或不严格递减. 首先修改后的数字一定是原来出现过的数字,这样就可以离散化. f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数 ...
- 【贪心】bzoj1592: [Usaco2008 Feb]Making the Grade 路面修整
贪心的经典套路:替换思想:有点抽象 Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也 就是说,高度上升与高度下降的路段不能 ...
- 2014.6.14模拟赛【bzoj1592】[Usaco2008 Feb]Making the Grade 路面修整
Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了 ...
- 【bzoj1592】[Usaco2008 Feb]Making the Grade 路面修整
FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个整数A_1, ...
- BZOJ1592 POJ3666 [Usaco2008 Feb]Making the Grade 路面修整 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3666 题目传送门 - BZOJ1592 题意概括 整条路被分成了N段,N个整数A_1, ... , ...
随机推荐
- linux中安装node
1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过 uname -a ...
- C# 实现程序开机自启动
最近在做一个自动备份文件的小工具,需要用到开机自启动 下面是代码 private void checkBox8_CheckedChanged(object sender, EventArgs e) { ...
- R语言绘图:ROC曲线图
使用pROC包绘制ROC曲线 #####***绘制ROC曲线***##### library("pROC") N <- dim(data2)[1] #数据长度 set.see ...
- P3388 【模板】割点
题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...
- 4-oracle11g安装
1.导入安装包,解压 [root@ocp Desktop]# unzip p10404530_112030_Linux-x86-64_1of7.zip [root@ocp Desktop]# unzi ...
- 从C到C++ (2)
从C到C++ (2) 一. C++中增加了作用域标示符 :: 1. 用于对局部变量同名的全局变量进行访问. 2. 用于表示类成员. 二. new.delete运算符 1. ...
- Android4.0系统以上程序不出现菜单键的问题解决
去掉targetSdkVersion 或改为targetSdkVersion =13或更小.. 不改targetSdkVersion的办法:在onCreate() 里setContentView()之 ...
- Sumsets 递推
Sumsets Time Limit : 6000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submi ...
- Linux-Shell脚本编程-学习-2-Linux基本命令
接上篇,接着学习Linux下的部分命令,后面的这些命令用到的频率可能没有那么多,不过也是经常需要的. 第一部分:程序监测部分,ps和top top命令可能比较眼熟,所以我们先说ps ps命令最烦人了, ...
- Python 3基础教程17-提问频率较高的几个Python问题
这里,介绍几个初学者经常上网查询的问题,直接看下面的例子 # 常见的一些常识问题汇总 #!/user/bin/python # 这个是linux下python文件的写法,告诉程序,这个文件是pytho ...