UVA12170 轻松爬山 Easy Climb 题解

UVA12170

7 月份的题了,补一补。场上写挂了一点还是很遗憾的。

容易想到 dp。

但是由于值域非常大,直接 dp 是不行的。但是 n 非常小,容易想到离散化。

但是离散化后是不能直接加减的。有用的数值初看是有 O(n2d) 的,即 hi+kd(k(n+1,n)),这肯定是不行的。但是通过观察可以发现这个东西肯定有一种方案存在 i,j 使得最终所有高度都能用 hi+jd 的方法表示出来。

这其实是很容易想到的,感性的想一下,后面有一个很高的 j,使得 ij 之间的山峰需要递增的话,第 j1 座山一定是 hi+kdhjd,因为如果是 hi+kd+Δ 且这个数与任意的 hj 的差均不是 d 的倍数时,它一定有更优的方法被 hj+kd 表示出来,即 Δ 是没有必要的,比如两个相邻的高度差为 H(H>d) 的山峰一定是变化 kd+Hmodd 的,再变就不优了。而 kmax=n1 的原因是 hnh1 最多就是 (n1)d,否则一定无解。

想到这里之后,dp 就是简单的了。

fi,j 表示前 i 座山,高度为 bj 时的最小花费,其中 b 为离散化后的数组。

fi,j=min|bjbk|m{fi1,k+|aibj|}

这样转移的复杂度太高,显然可以使用单调队列优化至 O(n3)

最后的答案是显而易见的:ans=fn,i(bi=an)

时间复杂度:O(n3)

空间复杂度:O(n2)

代码非常好写,就不放了。

posted @   Pengzt  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示