uva12170 轻松爬山

给一组数(高度)h1,h2,...,hn,要求修改h2~h(n-1)的值,使得h1,h2,...,hn中任意相邻两个数的差的绝对值不超过d。将某个hx从a修改到b的代价为|a-b|,求最小总代价。
n<=100 d<=1e9

基本思路是常规的动态规划,用dp[i][j]表示考虑前i个高度,并且第i个高度修改为j时的最小代价。但是这样j的范围太大,所以标准解答将dp的第二个维度离散化了。

可以证明这样的结论:在最优解中,任何一个高度都可以写成h_x+kd的形式,hx是h1~hn中的某个高度,k是(-2n,2n)之间的整数。

下面证明它。


假设上图是最优解中某个任意位置x以及它左右的一些高度。先说明一下这个图,每个方块的中心表示它的高度,方块边长为d,相邻方块均相连从而相邻高度差不超过d。

我们以x为中心向两边扩展所有只以1个点相连的其他高度,当出现相邻两个方块的公共部分是线段时就停下,也就是我们只考虑图中那些实线方块。

如果这一组方块中有任意一个处在自己原先的位置,那么x的位置显然符合结论。如果它们全部都不在自己原先的位置,那么我们可以把这个整体向上或向下移动微小距离而保证整体代价不增加,这个过程持续到其中任意一个方块移回原始位置或者虚线方块被纳入实线方块内。至此,结论的正确性显而易见。

如此状态数是O(n3),但转移似乎也要n2,时间复杂度承受不起。可以在计算dp(i,Hj)时按照Hj(Hj是一系列离散值)从小到大的顺序来算,由于dp(i,Hj)=|h[i]-Hj|+min{dp(i-1,Hx)|Hx∈[Hj-d,Hj+d]},所以相当于计算Hx在区间[Hj-d,Hj+d]上dp(i-1,Hx)的最小值,可以用滑动窗口+单调队列来处理,从而使转移复杂度变成平摊后O(1)。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define y second
#define x first
#define LL long long
#define INF 1e15
using namespace std;

const int maxn=100+5;
LL n,d,h[maxn],dp[maxn][2*maxn*maxn],f[2*maxn*maxn];
int fcnt;
pair<LL,int> q[2*maxn*maxn];

void solve(){
    fcnt=0;
    
    for(int i=0;i<n;i++)
        for(int k=-n+1;k<=n-1;k++)
            f[fcnt++]=h[i]+k*d;
    
    sort(f,f+fcnt);
    
    for(int j=0;j<fcnt;j++){
        dp[0][j]=INF;
    }
    
    int j0,je;
    for(int i=0;i<fcnt;i++){
        if(f[i]==h[0])j0=i;
        if(f[i]==h[n-1])je=i;
    }
    
    dp[0][j0]=0;
    
    for(int i=1;i<n;i++){
        int L=0,R=0;//[L,R)
        int ft=0,rr=0;//[ft,rr)
        for(int j=0;j<fcnt;j++){
            
            while(f[L]<f[j]-d){
                if(L==q[ft].y)ft++;
                L++;
            }
            while(R<fcnt&&f[R]<=f[j]+d){
                LL cur=dp[i-1][R];
                while(rr>ft&&cur<=q[rr-1].x)rr--;
                q[rr++]=make_pair(cur,R);
                R++;
            }
            
            if(q[ft].x!=INF){
                dp[i][j]=abs(f[j]-h[i])+q[ft].x;
            }else dp[i][j]=INF;
        }
    }
    
    if(dp[n-1][je]==INF)printf("impossible\n");
    else printf("%lld\n",dp[n-1][je]);
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld",&n,&d);
        for(int i=0;i<n;i++)scanf("%lld",&h[i]);
        solve();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,983评论 0 13
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,743评论 0 33
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • A股在千呼万唤始出来中解开了她犹抱琵琶半遮面的的狰狞面貌,之前各路游资,新闻唱多的热潮也冷了下来,不能说不对,...
    李曉玮阅读 425评论 0 0
  • 当哥伦布的后继者们拨开雨林繁茂的枝叶,趟过河流,来到印第安人驻地的时候,他们第一次接触了这种神奇的植物——烟草和古...
    曾诚阅读 430评论 0 4