zoukankan      html  css  js  c++  java
  • [POJ 3666] Making the Grade

    [题目链接]

             http://poj.org/problem?id=3666

    [算法]

           离散化 + dp

    [代码] 

              

    #include <algorithm>  
    #include <bitset>  
    #include <cctype>  
    #include <cerrno>  
    #include <clocale>  
    #include <cmath>  
    #include <complex>  
    #include <cstdio>  
    #include <cstdlib>  
    #include <cstring>  
    #include <ctime>  
    #include <deque>  
    #include <exception>  
    #include <fstream>  
    #include <functional>  
    #include <limits>  
    #include <list>  
    #include <map>  
    #include <iomanip>  
    #include <ios>  
    #include <iosfwd>  
    #include <iostream>  
    #include <istream>  
    #include <ostream>  
    #include <queue>  
    #include <set>  
    #include <sstream>  
    #include <stdexcept>  
    #include <streambuf>  
    #include <string>  
    #include <utility>  
    #include <vector>  
    #include <cwchar>  
    #include <cwctype>  
    #include <stack>  
    #include <limits.h> 
    using namespace std;
    #define MAXN 2010
    typedef long long ll;
    const ll INF = 1e15;
    
    int i,n,len;
    ll a[MAXN],tmp[MAXN];
    ll ans;
    ll dp[MAXN][MAXN];
    
    ll myabs(ll x)
    {
        return x < 0 ? -x : x;
    }
    inline ll dp1()
    {
        int i,j;
        ll mn = INF,ret = INF;
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= len; j++)
            {
                dp[i][j] = INF;
            }
        }
        for (i = 1; i <= len; i++) dp[1][i] = myabs(a[1] - tmp[i]);
        for (i = 2; i <= n; i++)
        {
            mn = INF;
            for (j = 1; j <= len; j++)
            {
                mn = min(mn,dp[i-1][j]);
                dp[i][j] = mn + myabs(a[i] - tmp[j]);
            }    
        }
        for (i = 1; i <= len; i++) ret = min(ret,dp[n][i]);
        return ret;
    }
    inline ll dp2()
    {
        int i,j;
        ll mn = INF,ret = INF;
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= len; j++)
            {
                dp[i][j] = INF;
            }
        }    
        for (i = 1; i <= len; i++) dp[1][i] = myabs(a[1] - tmp[i]);
        for (i = 2; i <= n; i++)
        {
            mn = INF;
            for (j = len; j >= 1; j--)
            {
                mn = min(mn,dp[i-1][j]);
                dp[i][j] = mn + myabs(a[i] - tmp[j]);
            }
        }
        for (i = 1; i <= len; i++) ret = min(ret,dp[n][i]);
        return ret;
    }
    
    int main()
    {
        
        scanf("%d",&n);
        for (i = 1; i <= n; i++) 
        {
            scanf("%lld",&a[i]);
            tmp[i] = a[i];
        }
        sort(tmp+1,tmp+n+1);
        len = unique(tmp+1,tmp+n+1) - tmp - 1;
        ans = min(dp1(),dp2());
        printf("%lld
    ",ans);
    
        return 0;
    }
  • 相关阅读:
    Android WebView常见问题及解决方案汇总【很全很实用】
    adb shell dumpsys meminfo [packagename] 输出内容的含义
    Android关于RAM、ROM、SD卡以及各种内存的区别
    每天5分钟玩转容器技术 整理目录
    ubuntu16.04基本设置
    ubuntu镜像快速下载
    vSphere 5.5.0 U1配置问题:主机的快速统计信息不是最新的(转载)
    Vcenter server 5.5安装部署
    SQL Server 2008 R2 数据库安装
    Centos7.3搭建DNS服务器--BIND
  • 原文地址:https://www.cnblogs.com/evenbao/p/9324790.html
Copyright © 2011-2022 走看看