Making the Grade POJ -DP-离散化

  • Making the Grade

  •  POJ - 3666 
  • 题意:给定A序列然后每个位置都一个高度,重新在每个位置选定一个高度使得整个序列为单调的,
  • 思路:不可以按照高度去枚举只能选择这给定的n的点的高度,(这就是离散化过程,不是真正离散化只是有点离散思想),
  • 之所以能这样是因为话费为每个位置改变的绝对值为了尽可能的小改变后的高度一定为原来序列中已经有的高度了,
  • 例如有有一个序列 3  ,2, 105 需要变2,2有很多选择在3-105之间,
  • 但是为了尽可能小的话费还是把2变为已经有的3就好了,
  • 这样就是一个单调序列了,(单调一般指>= 或<=)然后DP时此次更新需要从前面比它低的高度中选择一个,
  • 因为 i只与i-1有关系可以滚动数组优化一下
  • #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define maxn 2222
    #define inf 0x3f3f3f3f
    #define ll long long
    ll dp[3][maxn],maxx;
    ll b[maxn],n,a[maxn];
    int main()
    {
        scanf("%lld",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%lld",&a[i]);
            b[i]=a[i];
        }
        sort(b,b+n);
        int orz=0;
        ll ans=inf;
        for(int i=0; i<n; i++)
        {
            maxx=inf;
            for(int j=0; j<n; j++)
            {
                maxx=min(dp[orz][j],maxx);
                dp[orz^1][j]=maxx+fabs(a[i]-b[j]);
                if(i==n-1)ans=min(ans,dp[orz^1][j]);
            }
            orz^=1;
        }
        printf("%lld\n",ans);
        return 0;
    }
    

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值