还是挺难的一个题,看了书上的解析以后还是不会写,后来翻了代码仓库,发现lrj又用了一些玄学的优化技巧。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std; typedef long long LL; const int maxn = 100 + 5;
const int maxx = maxn * maxn * 2;
const LL INF = (1LL << 60); LL h[maxn], x[maxx], dp[2][maxx]; int main() {
int T;
cin >> T;
while (T--) {
int n;
LL d;
cin >> n >> d;
for (int i = 0; i < n; i++)
cin >> h[i];
if (abs(h[0] - h[n - 1]) > (n - 1) * d) { //-specially judge impossible
cout << "impossible\n";
continue;
} // useful heights //-?
int nx = 0;
for (int i = 0; i < n; i++)
for (int j = -n + 1; j <= n - 1; j++)
x[nx++] = h[i] + j * d;
sort(x, x + nx);
nx = unique(x, x + nx) - x; // dp
int t = 0;
for (int i = 0; i < nx; i++) {
dp[0][i] = INF;
if (x[i] == h[0])
dp[0][i] = 0;
}
for (int i = 1; i < n; i++) {
int k = 0;
for (int j = 0; j < nx; j++) {
while (k < nx && x[k] < x[j] - d)
k++;
while (k + 1 < nx && x[k + 1] <= x[j] + d && dp[t][k + 1] <= dp[t][k])
k++; // min in sliding window
if (dp[t][k] == INF)
dp[t ^ 1][j] = INF; // (t, k) is not reachable
else
dp[t ^ 1][j] = dp[t][k] + abs(x[j] - h[i]);
}
t ^= 1;
}
for (int i = 0; i < nx; i++)
if (x[i] == h[n - 1])
cout << dp[t][i] << "\n";
}
return 0;
}

首先这是一个背包类型的问题,朴素算法不仅会tle,还会mle,所有我们可以分析问题,得到一个O(n2)的状态设计。

其次,为了方便枚举,lrj使用了一个数组存储了所有可能用到的更新状态,这是一种坐标离散化的技巧,不然数组会过大。

然后,为了节省枚举时所花费的复杂度,lrj使用了单调队列来优化转移,同时,考虑到f[i-1]先单调减,又单调加,不需要维护完整的队列,只需要维护最小值即可。

最后使用了滚动数组进行优化。

这是一道经典题。

[uva12170]Easy Climb的更多相关文章

  1. 【暑假】[深入动态规划]UVa 12170 Easy Climb

    UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一 ...

  2. Easy Climb UVA - 12170 滚动dp +离散化+ 单调队列优化

    E.Easy Climb Somewhere in the neighborhood we have a very nice mountain that gives a splendid view o ...

  3. Easy Climb

    题意: 有n块石头,给定他们的高度,现保持第一和最后一块高度不变,其他可增加和减少高度,求通过变换使所有相邻石头的高度差的绝对值不大于d,所变化高度总和的最小值. 分析: 状态还可以想出来,dp[i] ...

  4. Leetcode解题思路总结(Easy篇)

    终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...

  5. Leetcode之70. Climbing Stairs Easy

    Leetcode 70 Climbing Stairs Easy https://leetcode.com/problems/climbing-stairs/ You are climbing a s ...

  6. 决战Leetcode: easy part(1-50)

    本博客是个人原创的针对leetcode上的problem的解法,所有solution都基本通过了leetcode的官方Judging,个别未通过的例外情况会在相应部分作特别说明. 欢迎互相交流! em ...

  7. leetcode 746. Min Cost Climbing Stairs(easy understanding dp solution)

    leetcode 746. Min Cost Climbing Stairs(easy understanding dp solution) On a staircase, the i-th step ...

  8. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

  9. Struts2 easy UI插件

    一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...

随机推荐

  1. Ext 修改Store初始化加载完后修改record属性。

    /** * Created by huangbaidong on 2016/9/18. * 产品组件通用Store, */ Ext.define('app.component.ebs.itemdata ...

  2. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  3. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

    上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建一个 ...

  4. 笔记本双系统XP与Ubuntu,重装XP后如何恢复grup引导,另附操作系统启动过程

    背景:笔记本双系统(XP与Ubuntu),其中XP系统因问题重装了一下,重装后不能识别Ubuntu系统(该系统装在另一个磁盘中),直接进入了XP系统. 解决办法:利用U盘(Ubuntu系统)启动机器, ...

  5. navigation和tabbar上的文字.图片 自定义

    [[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blackColor] ...

  6. HTTP协议GET和POST请求的区别

    浏览器中输入网址访问资源一般都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交.Http协议定义了与服务器交互的不同方法,最基本的方法有4种, ...

  7. singleton pattern的推荐实现

    一.单例模式的C#实现: (1)使用double-checked locking的方式: public sealed class Singleton { private static volatile ...

  8. YUV RGB播放器 打开, 显示RGB数据

    可以查看RGB像素数据 可以通过菜单栏打开像素数据文件,也可以通过拖拽方式打开文件.如果文件名称中包含了“{w}x{h}”这样的字符串(例如“test_320x420.yuv”),系统会自动解析为该像 ...

  9. ArcGIS 10与ArcEngine 10安装及破解

    1 2 3 4 5 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 百度经验:jingyan.baidu.com 现在常见的破解方法在下面的地址中已经详细附图说明了,但是这种破解方法,想 ...

  10. docker1.4版本devicemapper修改容器硬盘大小

    升级docker最新版(1.4.0)后,发现容器的硬盘空间只有10G,如果需要指定初始硬盘大小,目前的做法还比较粗暴,更改docker daemon的启动命令,然后删掉目前机器的已有镜像,重启dock ...