【DP】BZOJ1592-[Usaco2008 Feb]Making the Grade 路面修整
我活着从期中考试回来了!!!!!!!!!备考NOIP!!!!!!!!!
【题目大意】
给出n个整数a1~an,修改一个数的代价为修改前后差的绝对值,问修改成不下降序列或者不上升序列的最小总代价。
【思路】
预处理b[],为排序后的a[]。
f[i][j]表示前i个数,其中第i个数字修改为第j个大的数的最小代价。f[i][j]=min(f[i-1][k])+abs(a[i]-b[j]) (1<=k<=j)。b[]正反分别来一次。
这样是O(n^3)的,不过我们发现f[i-1][k]的最小值是可以直接保留下来的,所以最后复杂度为O(n)。
#include<bits/stdc++.h>
using namespace std;
const int INF=1e9;
const int MAXN=+;
int n,f[MAXN][MAXN],a[MAXN],b[MAXN],tmp[MAXN],premin[MAXN]; void dp()
{
memset(premin,,sizeof(premin));
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
f[i][j]=premin[j]+abs(a[i]-b[j]);
if (j==) premin[j]=f[i][j];else premin[j]=min(premin[j-],f[i][j]);
}
} void init()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
} void solve()
{
int ans=INF;
for (int i=;i<=n;i++) b[i]=a[i];
sort(b+,b+n+);
dp();
for (int i=;i<=n;i++) ans=min(ans,f[n][i]);
for (int i=;i<=n;i++) tmp[i]=b[i];
for (int i=;i<=n;i++) b[n-i+]=tmp[i];
dp();
for (int i=;i<=n;i++) ans=min(ans,f[n][i]);
printf("%d",ans);
} int main()
{
init();
solve();
return ;
}
忽然想到b[]中有一些数可能是重复的,所以可以离散化一下。快了一丢丢。

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9;
const int MAXN=+;
int n,m,f[MAXN][MAXN],a[MAXN],b[MAXN],tmp[MAXN],premin[MAXN]; void dp()
{
memset(premin,,sizeof(premin));
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
f[i][j]=premin[j]+abs(a[i]-b[j]);
if (j==) premin[j]=f[i][j];else premin[j]=min(premin[j-],f[i][j]);
}
} void init()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
} void solve()
{
int ans=INF;
for (int i=;i<=n;i++) b[i]=a[i];
sort(b+,b+n+);
m=unique(b+,b+n+)-(b+);
dp();
for (int i=;i<=m;i++) ans=min(ans,f[n][i]);
for (int i=;i<=m;i++) tmp[i]=b[i];
for (int i=;i<=m;i++) b[n-i+]=tmp[i];
dp();
for (int i=;i<=m;i++) ans=min(ans,f[n][i]);
printf("%d",ans);
} int main()
{
init();
solve();
return ;
}
【DP】BZOJ1592-[Usaco2008 Feb]Making the Grade 路面修整的更多相关文章
- [BZOJ1592] [Usaco2008 Feb]Making the Grade 路面修整(DP)
传送门 有个结论,每一个位置修改高度后的数,一定是原来在这个数列中出现过的数 因为最终结果要么不递增要么不递减, 不递增的话, 如果x1 >= x2那么不用动,如果x1 < x2,把x1变 ...
- 【贪心】bzoj1592: [Usaco2008 Feb]Making the Grade 路面修整
贪心的经典套路:替换思想:有点抽象 Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也 就是说,高度上升与高度下降的路段不能 ...
- BZOJ1592: [Usaco2008 Feb]Making the Grade 路面修整
n<=2000个数,把它修改成不上升或不下降序列所要改变的数值总共最小是多少yy一下可得最后改成的数值肯定是原数组数值中的某一个感觉一下,相邻两个数如果有冲突要改,那肯定把他们改成两者之一的数才 ...
- BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )
最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 ...
- 1592: [Usaco2008 Feb]Making the Grade 路面修整
1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 428 Solv ...
- 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, ... , ...
- 【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态
我们感性可证离散(不离散没法做),于是我们就有了状态转移的思路(我们只考虑单不减另一个同理),f[i][j]到了第i块高度为j的最小话费,于是我们就可以发现f[i][j]=Min(f[i-1][k]) ...
- bzoj 1592: [Usaco2008 Feb]Making the Grade 路面修整【dp】
因为是单调不降或单调不升,所以所有的bi如果都是ai中出现过的一定不会变差 以递增为例,设f[i][j]为第j段选第i大的高度,预处理出s[i][j]表示选第i大的时,前j个 a与第i大的值的差的绝对 ...
随机推荐
- 转:国内优秀npm镜像推荐及使用
原文:http://riny.net/2014/cnpm/ npm全称Node Package Manager,是node.js的模块依赖管理工具.由于npm的源在国外,所以国内用户使用起来各种不方便 ...
- [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)
[CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...
- linux中的计算【转】
shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看,呵呵 1.错误方法举例 a) var=1+1 echo $var 输出的结果是1+1 ...
- react native系列 - 从零开始构建
从零开始构建第一步,当然是从hello world开始,第一课我们没什么代码都不写,只用生成的代码来打包apk.为什么一开始就要学会打包,因为如果连打包都不会,以后做好了也没用.学会了打包,才能让我们 ...
- 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
之前介绍过关于HBase 0.9.8版本的部署及使用,本篇介绍下最新版本HBase1.2.4的部署及使用,有部分区别,详见如下: 1. 环境准备: 1.需要在Hadoop[hadoop-2.7.3] ...
- 005_linux下logrotate 配置和理解
对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以 ...
- 7.Python3标准库--文件系统
''' Python的标准库中包含大量工具,可以处理文件系统中的文件,构造和解析文件名,还可以检查文件内容. 处理文件的第一步是要确定处理的文件的名字.Python将文件名表示为简单的字符串,另外还提 ...
- LightOJ 1319 Monkey Tradition(中国剩余定理)
题目链接:https://vjudge.net/contest/28079#problem/U 题目大意:给你n(n<12)行,每行有pi,ri,求一个数ans满足ans%pi=ri(i从1~n ...
- poj 1077(BFS预处理+康托展开)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29935 Accepted: 13029 Special ...
- Python中的json操作
Python中的json操作 标签(空格分隔): python 编码 json 字符串前缀问题 字符串前缀可以有r,u r:表示原始(raw)字符串,比如'\n'不会被转义.常用于正则. u:表示un ...