标签:
给定一个序列,以最小代价将其变成单调不增或单调不减序列,这里的代价看题目公式
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;
}
标签:
原文地址:http://blog.csdn.net/u011932355/article/details/45530899