题意:

有n块石头,给定他们的高度,现保持第一和最后一块高度不变,其他可增加和减少高度,求通过变换使所有相邻石头的高度差的绝对值不大于d,所变化高度总和的最小值。

分析:

状态还可以想出来,dp[i][j]=min(dp[i-1][k])+abs(s[j]-h[i]),j,k表示i,i-1高度的状态,h[i]为初始高度。但高度太大,高度状态太多,没法下手,看过题解才知道,所有可能的高度状态有hi+kd(1<=i<=n,-n<k<n)种,现在理解的还不透,就可以把状态离散化,再递推就行了,开始可能min(dp[i-1][k])没求好,一直TE。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const long long inf=1LL<<;
const int N=;
const int MAX=N*N*;
int n,num;
long long h[N],s[MAX],dp[N][MAX],d;
int q[MAX];
void solve()
{
for(int i=;i<=n;i++)
for(int j=;j<num;j++)
dp[i][j]=inf;
int ind=lower_bound(s,s+num,h[])-s;
dp[][ind]=;
for(int i=;i<=n;i++)
{
int pre=,last=,now=;
for(int j=;j<num;j++)
{
while(now<num&&s[now]<=s[j]+d)
{
while(pre<last&&dp[i-][q[last-]]>=dp[i-][now])
last--;
q[last++]=now++;
}
while(pre<last&&s[j]-d>s[q[pre]])
pre++;
dp[i][j]=abs(h[i]-s[j])+dp[i-][q[pre]];
}
}
ind=lower_bound(s,s+num,h[n])-s;
if(dp[n][ind]>=inf)
printf("impossible\n");
else
printf("%lld\n",dp[n][ind]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
num=;
scanf("%d%lld",&n,&d);
for(int i=;i<=n;i++)
scanf("%lld",&h[i]);
for(int i=;i<=n;i++)
for(long long j=;j<n;j++)
{
s[num++]=h[i]-j*d;
s[num++]=h[i]+j*d;
}
sort(s,s+num);
num=unique(s,s+num)-s;
solve();
}
return ;
}

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. [uva12170]Easy Climb

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

  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. aChartEngine图表显示

    android的数据报表显示 从图中,我们可以看出,绘制一个图表我们其实,我们只需要理解三个概念 1,ChartFactory ,传入XYMutilpleSeriesRenderer,XYMutilp ...

  2. IOS:利用dispatch_once创建单例

    在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...

  3. MYSQL日常操作命令再熟悉

    1,创建用户及密码: CREATE USER 'user'@'%' IDENTIFIED BY 'password'; 2,创建数据库: create database PDB_chengang de ...

  4. iptables 代理设置

    代理: 开启转发:echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ...

  5. ios APP屏幕快照尺寸

    苹果上传APP审核需要上传APP屏幕快照,分别有3.5寸,4寸,4.7寸,5.5寸,ipad五种图片,对应尺寸大小: 3.5寸:横坚屏 640*960 或960*640 4寸:横坚屏 640*1036 ...

  6. centos 安装openssl 以及库文件

    yum install openssl yum install openssl-devel

  7. Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决

    Laptop: ACER Aspire 5733-6629 Wireless:Lite-on HB125, CHIPS: Atheros AR9485 Ubuntu: 10.04LTS (2.6.32 ...

  8. POJ 1808 Quadratic Residues(平方剩余相关)

    题目链接:http://poj.org/problem?id=1808 题意:如下.对于素数p,若存在x使得x^2%p=a,则其值为1.否则为-1.现在给出a.p,计算其值. 思路: 若a为正数则利用 ...

  9. sdut 2934 人活着系列之平方数 (完全背包变形)

    题目链接 分析:完全背包的变形,每一层的d[]数组代表这一层的这个数新加入以后所构成的val的种类. #include <iostream> #include <cstdio> ...

  10. poj 3264 Balanced Lineup (RMQ算法 模板题)

    RMQ支持操作: Query(L, R):  计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...