刷题——Making the Grade POJ

来源:互联网 发布:淘宝怎么用微信支付 编辑:程序博客网 时间:2024/06/05 09:00
/*
题目大意:给定一堆连续山坡的高度,要求变换山坡的高度使得山坡高度非上升或非下降
花费为|a1-b1|+|a2-b2|+...+|an-bn| a为原高度,b为变换后的高度,求最小花费
对与ai不管是增高或是降低很明显的它的变化的高度与它前一个山坡ai-1,和后面所有的山坡有关[ai+1,an]
所以,为了使花费更少bi=aj,若bi不等于aj,那一定会有一个比bi更小的ak或者更大的al满足条件,且花费更少
所以bi在[a1,an]中
所以令bi=ai,将bi排个序
dp[i][j],表示ai变成bj时,前i-1个山坡的最小花费+abs(a[i]-b[j])
dp[i][j]=abs(a[i]-b[j])+min(dp[i-1][1~j])(满足要求)
min(dp[i-1][1~j])用一个数组优化一下转换成前j个数的最小值
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define ll long long
#define INF 2*1e9
int n;
ll a[2005];
ll b[2005];
ll dp[2005];
ll d[2005];
ll abs(ll x,ll y){
    if(x>y){
        return x-y;
    }
    return y-x;
}
ll solve(){
    sort(b+1,b+1+n);
    ll minn=INF;
    for(int i=1;i<=n;i++){
        dp[i]=abs(a[1],b[i]);
        if(dp[i]<minn){
            minn=dp[i];
        }
        d[i]=minn;
    }
    for(int i=1;i<=n;i++){
        minn=INF;
        for(int j=1;j<=n;j++){
            dp[j]=d[j]+abs(a[i],b[j]);
            if(dp[j]<minn){
                minn=dp[j];
            }
            d[j]=minn;
        }
    }
    return minn;
}
int main(){
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            scanf("%I64d",&a[i]);
            b[i]=a[i];
        }
        printf("%I64d\n",solve());
    }
    return 0;
}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办 手指被挤压紫了怎么办 眼睛撞了有淤血怎么办 下眼底有小白点怎么办 狗的白眼球充血怎么办 眼球有出血点是怎么办 吃阿胶上火了该怎么办 胎儿胼胝体发育不良怎么办 鸡眼看到硬芯了怎么办 小脚趾起茧子疼怎么办 脚起老茧很痛怎么办 化疗后骨髓抑制严重怎么办 胃炎引起的胃胀怎么办 胃病胀肚子很鼓怎么办 小孩淋巴结发炎肚子疼痛怎么办 顺产后子宫脱垂怎么办 顺产完子宫脱垂怎么办 额头长了个鱼鳞怎么办 脸上长了很多痣怎么办