码迷,mamicode.com
首页 > 其他好文 > 详细

Making the Grade POJ - 3666

时间:2020-03-14 12:48:17      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:iostream   问题   out   clu   making   space   个数   ace   思考   

//一开始要思考:到底是增好还是减好
//然后用dp,忽略这个问题 
//首先要明确的是,最终序列中的数字一定都是原序列中的数字 
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2000+20;
int a[N];
int b[N];
int dp[N][N];
//dp[i,j],表示考虑前i个数变成单调,且最后一个数是b[j],此时的最小花费 
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],b[i]=a[i];
    sort(b+1,b+1+n);
    //考虑到第一个数,最后一个数变成b[j]时的最小花费 
    for(int j=1;j<=n;j++)
        dp[1][j]=abs(a[1]-b[j]);
    //从第二位开始考虑 
    for(int i=2;i<=n;i++)
    {
        //考虑到i-1位,变成单调,最后一个变成b1 
        int pre=dp[i-1][1];
        for(int j=1;j<=n;j++)
        {
            //考虑i-1位,变成单调,最后一个变成b[j]的最小花费 
            pre=min(pre,dp[i-1][j]);
            //考虑i位,变成单调,那么下一位变成b[j]的代价 
            dp[i][j]=pre+abs(a[i]-b[j]);
        }
    }
    cout << *min_element(dp[n]+1, dp[n] + n +1) << endl;
}

Making the Grade POJ - 3666

标签:iostream   问题   out   clu   making   space   个数   ace   思考   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12491188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!