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

POJ 3666 DP

时间:2015-05-06 11:04:45      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

给定一个序列,以最小代价将其变成单调不增或单调不减序列,这里的代价看题目公式

DP方程:dp[i][j]=abs(a[i]-b[j])+min(dp[i-1][k]);(k<=j)  前i个位置,结尾用b[j]的最小代价


详细题解:http://blog.csdn.net/wuyanyi/article/details/7255154



#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;

int Abs(int a)
{
    if (a<0) return -a;
    else return a;
}

int Min(int a,int b)
{
    if (a<b) return a;
    else return b;
}

int dp[2010][2010],a[2010],b[2010];

int main()
{
    int n,i,temp,j;
    while (scanf("%d",&n)!=EOF)
    {
        for (i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+1+n);

        for (i=1;i<=n;i++)
            dp[i][1]=Abs(a[1]-b[i]);

        for (i=2;i<=n;i++)
        {
            dp[i][1]=dp[i-1][1]+Abs(a[i]-b[1]);
            temp=dp[i-1][1];
            for (j=2;j<=n;j++)
            {
                temp=Min(temp,dp[i-1][j]);
                dp[i][j]=temp+Abs(a[i]-b[j]);
            }
        }
        temp=dp[n][1];
        for (i=2;i<=n;i++)
            temp=Min(temp,dp[n][i]);
        printf("%d\n",temp);
    }
    return 0;
}


POJ 3666 DP

标签:

原文地址:http://blog.csdn.net/u011932355/article/details/45530899

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