zoukankan      html  css  js  c++  java
  • POJ3666

    题意

    先给出了一个(n),之后给出(n)个数,

    要求通过改变一些数,使得最后变成有序的序列(增或减),输出最小的修改量。

    思路

    二维DP+滚动数组。

    因为数据较弱,所以不用严格递增或严格递减,所以序列中的高度一定是出现过的高度。

    所以,最终修改后,或者和前一个数字一样,或者和后一个数字一样,这样才能使修改量最小。

    所以先排序,

    dp[i][j]:表示前(i)个元素,最后元素为序列中第(j)小元素的最优解。

    AC代码

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<cmath>
    #include<list>
    #include<stdlib.h>
    #include<map>
    #include<vector>
    #include<stack>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    typedef long long ll;
    #define sc(T) scanf("%d",&T)
    #define scc(x,y) scanf("%d %d",&x,&y)
    #define pr(T) printf("%d
    ",T)
    #define f(a,b,c) for (int a=b;a<c;a++)
    #define ff(a,b,c) for (int a=b;a>c;a--)
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-9
    #define PI acos(-1)
    
    const int N=2010;
    int a[N],b[N],dp[2][N];
    
    int main()
    {
        int n;
        sc(n);
        for(int i=1; i<=n; i++)
            sc(a[i]),b[i]=a[i];
        sort(b+1,b+1+n);
        for(int i=1; i<=n; i++)
            dp[0][i]=abs(a[1]-b[i]);
        for(int i=2; i<=n; i++)
        {
            int k=dp[i%2][1];
            for(int j=1; j<=n; j++)
            {
                k=min(k,dp[i%2][j]);
                int t=abs(a[i]-b[j]);
                dp[(i+1)%2][j]=k+t;
            }
        }
        int kk=(n+1)%2,w=dp[kk][1];
        for(int i=2; i<=n; i++)
            w=min(w,dp[kk][i]);
        pr(w);
        return 0;
    }
    
  • 相关阅读:
    写给自己的2020年总结
    docker镜像与docker容器
    docker安装&docker简介
    windows 安装linux子系统
    typora设置图床
    让Mysql插入中文
    pip 换源
    Unity中如何将一个场景(Scene)的Light Settings复制给另一个场景
    Windows API开发
    【C#】判断字符串中是否包含指定字符串,contains与indexOf方法效率问题
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13728109.html
Copyright © 2011-2022 走看看