POJ 3666 DP

来源:互联网 发布:okhttp源码解析 编辑:程序博客网 时间:2024/06/16 05:08

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

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;}


0 0