zoukankan      html  css  js  c++  java
  • C

    题目链接:http://codeforces.com/problemset/problem/13/C

    Little Petya likes to play very much. And most of all he likes to play the following game:

    He is given a sequence of N integer numbers. At each step it is allowed to increase the value of any number by 1 or to decrease it by 1. The goal of the game is to make the sequence non-decreasing with the smallest number of steps. Petya is not good at math, so he asks for your help.

    The sequence a is called non-decreasing if a1 ≤ a2 ≤ ... ≤ aN holds, where N is the length of the sequence.

    Input

    The first line of the input contains single integer N (1 ≤ N ≤ 5000) — the length of the initial sequence. The following N lines contain one integer each — elements of the sequence. These numbers do not exceed 109 by absolute value.

    Output

    Output one integer — minimum number of steps required to achieve the goal.

    Examples

    Input
    5
    3 2 -1 2 11
    Output
    4
    Input
    5
    2 1 1 1 1
    Output
    1
    题目大意:大概的题意就是每次可以对一个数加一或者减一,然后用最小的代价使得原序列变成不下降的序列。
    思路:自己最开始的思路是dp[i][j] 第i个数刚好为第j大,并且前i个数满足不递减的关系的最少步数,但是这样想的话要用三重for 所以就超时了 因为我们要枚举从上一个数的所有大小转变过来
    这就加了一维了。
    正解:dp[i][j]表示前i个树不大于j 并且满足不递减的关系的最少步数
    因为是不大于j 所以dp[i][j]可以等于dp[i][j-1]和dp[i-1][j]+abs(a[i]-a[j]) 这样就只有二维了
    看代码:
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<map>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<map>
    #include<queue>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ull;
    #define sc1(a) scanf("%lld",&a)
    #define pf1(a) printf("%lld
    ",a)
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    const LL INF=1e18;
    const ull base=2333;
    const int maxn=5e3+5;
    const int maxm=1e3+50;
    const int maxv=1e6+5;
    const int mod=1e9+7;
    const int ba=3e5;
    LL N;
    LL a[maxn],b[maxn];
    /**
    dp[i][j]表示前i个数最大的数不大于第j大的数 并且前i个数单调不递减的最小步数
    */
    LL dp[5][maxn];
    int main()
    {
        sc1(N);
        for(int i=1;i<=N;i++)
        {
            sc1(a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+1+N);//从小到大
        for(int i=0;i<=1;i++)
        {
            for(int j=0;j<=N;j++) dp[i][j]=INF;
        }
        for(int i=1;i<=N;i++)
        {
            dp[0][i]=0;
        }
        for(int i=1;i<=N;i++)
        {
            int v=i%2;
            int w=(i-1)%2;
            for(int j=0;j<=N;j++) dp[v][j]=INF;
            for(int j=1;j<=N;j++)
            {
                dp[v][j]=min(dp[v][j-1],dp[w][j]+abs(a[i]-b[j]));
            }
        }
        LL ans=INF;
        int v=N%2;
        for(int i=1;i<=N;i++) ans=min(ans,dp[v][i]);
        pf1(ans);
        return 0;
    }
    /**
    
    */
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/caijiaming/p/12371040.html
Copyright © 2011-2022 走看看