首页 > 其他 > 详细

POJ 3666 DP

时间:2015-05-06 11:04:24      阅读:258      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!